bricks-builder-mcp 3.1.1 → 3.4.0
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/package.json +1 -1
- package/server.js +298 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "bricks-builder-mcp",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.4.0",
|
|
5
5
|
"description": "Serveur MCP pour piloter Bricks Builder (WordPress) depuis Claude — édition de pages, gestion d'éléments, réordonnancement des sections.",
|
|
6
6
|
"main": "server.js",
|
|
7
7
|
"bin": {
|
package/server.js
CHANGED
|
@@ -356,6 +356,182 @@ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
356
356
|
required: ["pageId", "orderedIds"],
|
|
357
357
|
},
|
|
358
358
|
},
|
|
359
|
+
|
|
360
|
+
// ===== OUTIL v3.2.0 — CRÉATION DE PAGES =====
|
|
361
|
+
|
|
362
|
+
{
|
|
363
|
+
name: "create_page",
|
|
364
|
+
description: "Crée une nouvelle page WordPress et l'active immédiatement en mode Bricks Builder. Utilise pour démarrer un nouveau site ou ajouter une page (Accueil, Services, Contact, etc.). Renvoie l'ID de la page créée, prêt à être utilisé avec les autres outils MCP.",
|
|
365
|
+
inputSchema: {
|
|
366
|
+
type: "object",
|
|
367
|
+
properties: {
|
|
368
|
+
title: {
|
|
369
|
+
type: "string",
|
|
370
|
+
description: "Titre de la page (ex: 'Accueil', 'Services', 'Contact')",
|
|
371
|
+
},
|
|
372
|
+
slug: {
|
|
373
|
+
type: "string",
|
|
374
|
+
description: "Slug URL optionnel (ex: 'accueil'). Si omis, sera généré depuis le titre.",
|
|
375
|
+
},
|
|
376
|
+
status: {
|
|
377
|
+
type: "string",
|
|
378
|
+
enum: ["publish", "draft", "private"],
|
|
379
|
+
description: "Statut de publication (défaut: 'publish')",
|
|
380
|
+
},
|
|
381
|
+
setAsHomepage: {
|
|
382
|
+
type: "boolean",
|
|
383
|
+
description: "Si true, configure cette page comme page d'accueil du site (défaut: false)",
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
required: ["title"],
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
|
|
390
|
+
// ===== OUTILS v3.3.0 — GESTION DES PAGES =====
|
|
391
|
+
|
|
392
|
+
{
|
|
393
|
+
name: "delete_page",
|
|
394
|
+
description: "Supprime une page WordPress. Par défaut la met à la corbeille (récupérable). Utilise force=true pour supprimer définitivement (irréversible). Refuse de supprimer la page d'accueil active — la changer d'abord.",
|
|
395
|
+
inputSchema: {
|
|
396
|
+
type: "object",
|
|
397
|
+
properties: {
|
|
398
|
+
pageId: { type: "number", description: "L'ID de la page à supprimer" },
|
|
399
|
+
force: { type: "boolean", description: "Si true, suppression définitive. Sinon, mise à la corbeille (défaut: false)" },
|
|
400
|
+
},
|
|
401
|
+
required: ["pageId"],
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
name: "update_page_meta",
|
|
406
|
+
description: "Met à jour les méta-données d'une page (titre, slug URL, statut de publication, page parente). Seuls les champs fournis sont modifiés. Utile pour renommer, changer l'URL, publier un draft, organiser la hiérarchie.",
|
|
407
|
+
inputSchema: {
|
|
408
|
+
type: "object",
|
|
409
|
+
properties: {
|
|
410
|
+
pageId: { type: "number", description: "L'ID de la page à modifier" },
|
|
411
|
+
title: { type: "string", description: "Nouveau titre (optionnel)" },
|
|
412
|
+
slug: { type: "string", description: "Nouveau slug URL (optionnel, ex: 'accueil')" },
|
|
413
|
+
status: { type: "string", enum: ["publish", "draft", "private", "pending"], description: "Nouveau statut de publication (optionnel)" },
|
|
414
|
+
parentId: { type: "number", description: "ID de la page parente (0 = racine, optionnel)" },
|
|
415
|
+
},
|
|
416
|
+
required: ["pageId"],
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
name: "duplicate_page",
|
|
421
|
+
description: "Duplique une page existante avec son contenu Bricks complet (sections, éléments, settings). Très utile pour créer des variantes à partir d'une page bien faite, ou pour partir d'un template existant. La copie est créée en draft par défaut.",
|
|
422
|
+
inputSchema: {
|
|
423
|
+
type: "object",
|
|
424
|
+
properties: {
|
|
425
|
+
sourcePageId: { type: "number", description: "ID de la page source à dupliquer" },
|
|
426
|
+
newTitle: { type: "string", description: "Titre de la copie (optionnel, défaut: 'Copie de {original}')" },
|
|
427
|
+
status: { type: "string", enum: ["publish", "draft", "private", "pending"], description: "Statut de la copie (défaut: 'draft')" },
|
|
428
|
+
},
|
|
429
|
+
required: ["sourcePageId"],
|
|
430
|
+
},
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
name: "set_homepage",
|
|
434
|
+
description: "Définit une page comme page d'accueil du site WordPress. La page doit être publiée. Pour réinitialiser sur les derniers articles (mode WordPress par défaut), passer reset=true.",
|
|
435
|
+
inputSchema: {
|
|
436
|
+
type: "object",
|
|
437
|
+
properties: {
|
|
438
|
+
pageId: { type: "number", description: "ID de la page à mettre en accueil" },
|
|
439
|
+
reset: { type: "boolean", description: "Si true, reset sur les derniers articles (pageId ignoré)" },
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
},
|
|
443
|
+
|
|
444
|
+
// ===== OUTILS v3.4.0 — HEALTH, MÉDIAS, MENUS, STYLES GLOBAUX =====
|
|
445
|
+
|
|
446
|
+
{
|
|
447
|
+
name: "health_check",
|
|
448
|
+
description: "Test de connexion au site WordPress + infos système (versions plugin/WP/PHP/Bricks, multisite, URL). Utile pour debug et confirmer qu'on parle au bon site.",
|
|
449
|
+
inputSchema: { type: "object", properties: {} },
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
name: "list_all_pages",
|
|
453
|
+
description: "Liste TOUTES les pages WordPress du site (pas seulement celles avec contenu Bricks). Inclut les pages WP standard. Utile pour avoir l'inventaire complet avant de créer/dupliquer/nettoyer.",
|
|
454
|
+
inputSchema: { type: "object", properties: {} },
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
name: "upload_media",
|
|
458
|
+
description: "Télécharge une image depuis une URL et l'ajoute à la médiathèque WordPress. Renvoie l'URL WP de l'image, prête à utiliser dans les éléments Bricks (image, background, etc.). Très utile pour intégrer des photos client sans passer par la médiathèque WP manuellement.",
|
|
459
|
+
inputSchema: {
|
|
460
|
+
type: "object",
|
|
461
|
+
properties: {
|
|
462
|
+
sourceUrl: { type: "string", description: "URL publique de l'image à télécharger (jpg/png/webp/gif/svg)" },
|
|
463
|
+
title: { type: "string", description: "Titre de l'image dans la médiathèque (optionnel)" },
|
|
464
|
+
alt: { type: "string", description: "Alt text pour SEO/accessibilité (optionnel mais fortement recommandé)" },
|
|
465
|
+
caption: { type: "string", description: "Légende affichée sous l'image (optionnel)" },
|
|
466
|
+
},
|
|
467
|
+
required: ["sourceUrl"],
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
name: "list_media",
|
|
472
|
+
description: "Liste paginée des médias de la médiathèque WordPress avec leurs URLs. Filtrable par recherche. Utile pour retrouver des images déjà uploadées.",
|
|
473
|
+
inputSchema: {
|
|
474
|
+
type: "object",
|
|
475
|
+
properties: {
|
|
476
|
+
page: { type: "number", description: "Page de pagination (défaut: 1)" },
|
|
477
|
+
perPage: { type: "number", description: "Nombre par page (défaut: 20, max: 100)" },
|
|
478
|
+
search: { type: "string", description: "Recherche textuelle dans les titres/noms de fichier" },
|
|
479
|
+
},
|
|
480
|
+
},
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
name: "list_menus",
|
|
484
|
+
description: "Liste les menus de navigation WordPress du site avec leur nombre d'items et les emplacements assignés (header, footer, etc.). À utiliser avant add_menu_item.",
|
|
485
|
+
inputSchema: { type: "object", properties: {} },
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: "add_menu_item",
|
|
489
|
+
description: "Ajoute un item à un menu WordPress de navigation. Soit on lie une page existante (via pageId), soit un lien custom (via customUrl + label). Très utile pour ajouter automatiquement les nouvelles pages au menu principal.",
|
|
490
|
+
inputSchema: {
|
|
491
|
+
type: "object",
|
|
492
|
+
properties: {
|
|
493
|
+
menuId: { type: "number", description: "ID du menu (cf list_menus)" },
|
|
494
|
+
pageId: { type: "number", description: "ID de la page à ajouter (mode 'page')" },
|
|
495
|
+
customUrl: { type: "string", description: "URL custom (mode 'lien externe')" },
|
|
496
|
+
label: { type: "string", description: "Libellé visible. Si pageId fourni, par défaut prend le titre de la page" },
|
|
497
|
+
parentItemId: { type: "number", description: "Mettre cet item comme enfant d'un autre item (sous-menu)" },
|
|
498
|
+
},
|
|
499
|
+
required: ["menuId"],
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
name: "get_global_styles",
|
|
504
|
+
description: "Récupère les settings globaux de Bricks Builder pour ce site (typographie globale, breakpoints, palette, classes globales, theme styles). Utile au début d'un projet pour comprendre la base visuelle existante.",
|
|
505
|
+
inputSchema: { type: "object", properties: {} },
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
name: "update_global_styles",
|
|
509
|
+
description: "Met à jour les settings globaux Bricks via fusion récursive. Utile pour appliquer une typo de site ou une convention CSS partout d'un coup. Seuls les champs fournis sont modifiés.",
|
|
510
|
+
inputSchema: {
|
|
511
|
+
type: "object",
|
|
512
|
+
properties: {
|
|
513
|
+
settings: { type: "object", description: "Settings à fusionner avec l'existant" },
|
|
514
|
+
},
|
|
515
|
+
required: ["settings"],
|
|
516
|
+
},
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
name: "list_color_palette",
|
|
520
|
+
description: "Récupère la palette de couleurs globale Bricks (les couleurs nommées réutilisables sur tout le site).",
|
|
521
|
+
inputSchema: { type: "object", properties: {} },
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
name: "add_color_to_palette",
|
|
525
|
+
description: "Ajoute une couleur à la palette globale Bricks. Permet ensuite de l'utiliser dans n'importe quel élément via son ID/nom plutôt que de répéter la valeur hex partout.",
|
|
526
|
+
inputSchema: {
|
|
527
|
+
type: "object",
|
|
528
|
+
properties: {
|
|
529
|
+
name: { type: "string", description: "Nom de la couleur (ex: 'Primaire', 'Accent orange')" },
|
|
530
|
+
hex: { type: "string", description: "Valeur hexadécimale (ex: '#ff6b35' ou 'ff6b35')" },
|
|
531
|
+
},
|
|
532
|
+
required: ["name", "hex"],
|
|
533
|
+
},
|
|
534
|
+
},
|
|
359
535
|
],
|
|
360
536
|
};
|
|
361
537
|
});
|
|
@@ -482,6 +658,128 @@ mcpServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
482
658
|
});
|
|
483
659
|
break;
|
|
484
660
|
|
|
661
|
+
// ===== OUTIL v3.2.0 — CRÉATION DE PAGES =====
|
|
662
|
+
|
|
663
|
+
case "create_page":
|
|
664
|
+
console.error(`[LOG] Exécution: create_page avec title="${args.title}"`);
|
|
665
|
+
result = await callWordPressAPI("/create-page", "POST", {
|
|
666
|
+
title: args.title,
|
|
667
|
+
slug: args.slug || "",
|
|
668
|
+
status: args.status || "publish",
|
|
669
|
+
setAsHomepage: args.setAsHomepage || false,
|
|
670
|
+
});
|
|
671
|
+
break;
|
|
672
|
+
|
|
673
|
+
// ===== OUTILS v3.3.0 — GESTION DES PAGES =====
|
|
674
|
+
|
|
675
|
+
case "delete_page":
|
|
676
|
+
console.error(`[LOG] Exécution: delete_page pageId=${args.pageId} force=${args.force}`);
|
|
677
|
+
result = await callWordPressAPI("/delete-page", "POST", {
|
|
678
|
+
pageId: args.pageId,
|
|
679
|
+
force: args.force || false,
|
|
680
|
+
});
|
|
681
|
+
break;
|
|
682
|
+
|
|
683
|
+
case "update_page_meta":
|
|
684
|
+
console.error(`[LOG] Exécution: update_page_meta pageId=${args.pageId}`);
|
|
685
|
+
result = await callWordPressAPI("/update-page-meta", "POST", {
|
|
686
|
+
pageId: args.pageId,
|
|
687
|
+
title: args.title,
|
|
688
|
+
slug: args.slug,
|
|
689
|
+
status: args.status,
|
|
690
|
+
parentId: args.parentId,
|
|
691
|
+
});
|
|
692
|
+
break;
|
|
693
|
+
|
|
694
|
+
case "duplicate_page":
|
|
695
|
+
console.error(`[LOG] Exécution: duplicate_page source=${args.sourcePageId}`);
|
|
696
|
+
result = await callWordPressAPI("/duplicate-page", "POST", {
|
|
697
|
+
sourcePageId: args.sourcePageId,
|
|
698
|
+
newTitle: args.newTitle || "",
|
|
699
|
+
status: args.status || "draft",
|
|
700
|
+
});
|
|
701
|
+
break;
|
|
702
|
+
|
|
703
|
+
case "set_homepage":
|
|
704
|
+
console.error(`[LOG] Exécution: set_homepage pageId=${args.pageId} reset=${args.reset}`);
|
|
705
|
+
result = await callWordPressAPI("/set-homepage", "POST", {
|
|
706
|
+
pageId: args.pageId,
|
|
707
|
+
reset: args.reset || false,
|
|
708
|
+
});
|
|
709
|
+
break;
|
|
710
|
+
|
|
711
|
+
// ===== OUTILS v3.4.0 — HEALTH, MÉDIAS, MENUS, STYLES GLOBAUX =====
|
|
712
|
+
|
|
713
|
+
case "health_check":
|
|
714
|
+
console.error(`[LOG] Exécution: health_check`);
|
|
715
|
+
result = await callWordPressAPI("/health", "GET");
|
|
716
|
+
break;
|
|
717
|
+
|
|
718
|
+
case "list_all_pages":
|
|
719
|
+
console.error(`[LOG] Exécution: list_all_pages`);
|
|
720
|
+
result = await callWordPressAPI("/list-all-pages", "GET");
|
|
721
|
+
break;
|
|
722
|
+
|
|
723
|
+
case "upload_media":
|
|
724
|
+
console.error(`[LOG] Exécution: upload_media depuis ${args.sourceUrl}`);
|
|
725
|
+
result = await callWordPressAPI("/upload-media", "POST", {
|
|
726
|
+
sourceUrl: args.sourceUrl,
|
|
727
|
+
title: args.title,
|
|
728
|
+
alt: args.alt,
|
|
729
|
+
caption: args.caption,
|
|
730
|
+
});
|
|
731
|
+
break;
|
|
732
|
+
|
|
733
|
+
case "list_media":
|
|
734
|
+
console.error(`[LOG] Exécution: list_media page=${args.page} perPage=${args.perPage}`);
|
|
735
|
+
result = await callWordPressAPI("/list-media", "POST", {
|
|
736
|
+
page: args.page || 1,
|
|
737
|
+
perPage: args.perPage || 20,
|
|
738
|
+
search: args.search,
|
|
739
|
+
});
|
|
740
|
+
break;
|
|
741
|
+
|
|
742
|
+
case "list_menus":
|
|
743
|
+
console.error(`[LOG] Exécution: list_menus`);
|
|
744
|
+
result = await callWordPressAPI("/list-menus", "GET");
|
|
745
|
+
break;
|
|
746
|
+
|
|
747
|
+
case "add_menu_item":
|
|
748
|
+
console.error(`[LOG] Exécution: add_menu_item menuId=${args.menuId}`);
|
|
749
|
+
result = await callWordPressAPI("/add-menu-item", "POST", {
|
|
750
|
+
menuId: args.menuId,
|
|
751
|
+
pageId: args.pageId,
|
|
752
|
+
customUrl: args.customUrl,
|
|
753
|
+
label: args.label,
|
|
754
|
+
parentItemId: args.parentItemId,
|
|
755
|
+
});
|
|
756
|
+
break;
|
|
757
|
+
|
|
758
|
+
case "get_global_styles":
|
|
759
|
+
console.error(`[LOG] Exécution: get_global_styles`);
|
|
760
|
+
result = await callWordPressAPI("/get-global-styles", "GET");
|
|
761
|
+
break;
|
|
762
|
+
|
|
763
|
+
case "update_global_styles":
|
|
764
|
+
console.error(`[LOG] Exécution: update_global_styles`);
|
|
765
|
+
result = await callWordPressAPI("/update-global-styles", "POST", {
|
|
766
|
+
settings: args.settings || {},
|
|
767
|
+
});
|
|
768
|
+
break;
|
|
769
|
+
|
|
770
|
+
case "list_color_palette":
|
|
771
|
+
console.error(`[LOG] Exécution: list_color_palette`);
|
|
772
|
+
result = await callWordPressAPI("/list-color-palette", "GET");
|
|
773
|
+
break;
|
|
774
|
+
|
|
775
|
+
case "add_color_to_palette":
|
|
776
|
+
console.error(`[LOG] Exécution: add_color_to_palette name="${args.name}"`);
|
|
777
|
+
result = await callWordPressAPI("/add-color-to-palette", "POST", {
|
|
778
|
+
name: args.name,
|
|
779
|
+
hex: args.hex,
|
|
780
|
+
});
|
|
781
|
+
break;
|
|
782
|
+
|
|
485
783
|
default:
|
|
486
784
|
console.error(`[LOG] Tool inconnu: ${name}`);
|
|
487
785
|
result = { error: `Tool ${name} not found` };
|