bricks-builder-mcp 3.12.0 → 3.12.3
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 +25 -10
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "bricks-builder-mcp",
|
|
4
|
-
"version": "3.12.
|
|
4
|
+
"version": "3.12.3",
|
|
5
5
|
"description": "Serveur MCP pour piloter Bricks Builder (WordPress) depuis Claude/Codex — édition de pages, gestion d'éléments, audit technique, audit design visuel, upload optimisé WebP. Communauté Discord : https://discord.gg/rX22zHRzH",
|
|
6
6
|
"homepage": "https://discord.gg/rX22zHRzH",
|
|
7
7
|
"main": "server.js",
|
package/server.js
CHANGED
|
@@ -570,7 +570,7 @@ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
570
570
|
|
|
571
571
|
{
|
|
572
572
|
name: "update_element",
|
|
573
|
-
description: "Modifie UN SEUL élément sans recharger/renvoyer toute la page. Ultra économe en tokens. Utilise pour changer une couleur, un texte, etc. Permet aussi de renommer l'élément dans la structure Bricks via le paramètre `label`.",
|
|
573
|
+
description: "Modifie UN SEUL élément sans recharger/renvoyer toute la page. Ultra économe en tokens. Utilise pour changer une couleur, un texte, etc. Permet aussi de renommer l'élément dans la structure Bricks via le paramètre `label`. Si un élément `code` exécutable est modifié, la réponse indique qu'une signature manuelle Bricks est requise.",
|
|
574
574
|
inputSchema: {
|
|
575
575
|
type: "object",
|
|
576
576
|
properties: {
|
|
@@ -597,7 +597,7 @@ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
597
597
|
|
|
598
598
|
{
|
|
599
599
|
name: "add_element",
|
|
600
|
-
description: "Ajoute UN SEUL nouvel élément à la page. Utilise pour ajouter un bouton, un paragraphe, etc.",
|
|
600
|
+
description: "Ajoute UN SEUL nouvel élément à la page. Utilise pour ajouter un bouton, un paragraphe, etc. Si `element.parent` pointe vers un élément existant, le parent.children est synchronisé automatiquement.",
|
|
601
601
|
inputSchema: {
|
|
602
602
|
type: "object",
|
|
603
603
|
properties: {
|
|
@@ -620,7 +620,7 @@ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
620
620
|
|
|
621
621
|
{
|
|
622
622
|
name: "batch_add",
|
|
623
|
-
description: "Ajoute PLUSIEURS éléments en UNE SEULE fois. Utilise pour créer une section complète (5-10 éléments). Plus efficace que add_element en boucle.",
|
|
623
|
+
description: "Ajoute PLUSIEURS éléments en UNE SEULE fois. Utilise pour créer une section complète (5-10 éléments). Synchronise automatiquement les parent.children des éléments ajoutés. Plus efficace que add_element en boucle.",
|
|
624
624
|
inputSchema: {
|
|
625
625
|
type: "object",
|
|
626
626
|
properties: {
|
|
@@ -830,7 +830,7 @@ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
830
830
|
},
|
|
831
831
|
{
|
|
832
832
|
name: "get_element_schema",
|
|
833
|
-
description: "Découvre les éléments Bricks disponibles et leurs contrôles natifs
|
|
833
|
+
description: "Découvre les éléments Bricks disponibles et leurs contrôles natifs. Sans `element`, retourne le catalogue compact. Avec `element` (ex: button, image, form), retourne les contrôles/settings runtime si disponibles, sinon tente le schema officiel Bricks Academy en fallback + les settings hérités communs si includeInherited=true.",
|
|
834
834
|
inputSchema: {
|
|
835
835
|
type: "object",
|
|
836
836
|
properties: {
|
|
@@ -1066,13 +1066,16 @@ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
1066
1066
|
},
|
|
1067
1067
|
{
|
|
1068
1068
|
name: "set_page_custom_code",
|
|
1069
|
-
description: "Définit du CSS et/ou JS spécifique à une page (Page Settings → Custom Code).
|
|
1069
|
+
description: "Définit du CSS et/ou JS spécifique à une page (Page Settings → Custom Code). Utiliser les emplacements Bricks natifs : customScriptsHeader, customScriptsBodyHeader, customScriptsBodyFooter. `customScripts` reste un alias legacy vers body footer.",
|
|
1070
1070
|
inputSchema: {
|
|
1071
1071
|
type: "object",
|
|
1072
1072
|
properties: {
|
|
1073
|
-
pageId:
|
|
1074
|
-
customCss:
|
|
1075
|
-
|
|
1073
|
+
pageId: { type: "number", description: "ID de la page" },
|
|
1074
|
+
customCss: { type: "string", description: "CSS de la page (injecté uniquement sur cette page)" },
|
|
1075
|
+
customScriptsHeader: { type: "string", description: "HTML/scripts injectés dans <head> uniquement sur cette page" },
|
|
1076
|
+
customScriptsBodyHeader: { type: "string", description: "HTML/scripts injectés juste après <body> uniquement sur cette page" },
|
|
1077
|
+
customScriptsBodyFooter: { type: "string", description: "HTML/scripts injectés avant </body> uniquement sur cette page" },
|
|
1078
|
+
customScripts: { type: "string", description: "Alias legacy : écrit dans customScriptsBodyFooter" },
|
|
1076
1079
|
},
|
|
1077
1080
|
required: ["pageId"],
|
|
1078
1081
|
},
|
|
@@ -1848,6 +1851,9 @@ mcpServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1848
1851
|
result = await callWordPressAPI("/set-page-custom-code", "POST", {
|
|
1849
1852
|
pageId: args.pageId,
|
|
1850
1853
|
customCss: args.customCss,
|
|
1854
|
+
customScriptsHeader: args.customScriptsHeader,
|
|
1855
|
+
customScriptsBodyHeader: args.customScriptsBodyHeader,
|
|
1856
|
+
customScriptsBodyFooter: args.customScriptsBodyFooter,
|
|
1851
1857
|
customScripts: args.customScripts,
|
|
1852
1858
|
});
|
|
1853
1859
|
break;
|
|
@@ -2081,17 +2087,26 @@ mcpServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
2081
2087
|
const allBrxe = Array.from(el.querySelectorAll('[id^="brxe-"], [class*="brxe-"]'));
|
|
2082
2088
|
const emptyContainers = [];
|
|
2083
2089
|
const MIN_AREA = 2500;
|
|
2090
|
+
const MEDIA_TAGS = new Set(['IMG', 'PICTURE', 'SVG', 'VIDEO', 'IFRAME', 'CANVAS', 'AUDIO', 'OBJECT', 'EMBED']);
|
|
2091
|
+
const INTERACTIVE_TAGS = new Set(['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']);
|
|
2084
2092
|
allBrxe.forEach(b => {
|
|
2093
|
+
// Bricks 2.3 peut rendre l'élément Image directement en <img class="brxe-image">.
|
|
2094
|
+
// Dans ce cas l'élément EST le média, pas un wrapper vide.
|
|
2095
|
+
if (MEDIA_TAGS.has(b.tagName) || INTERACTIVE_TAGS.has(b.tagName)) return;
|
|
2085
2096
|
const brect = b.getBoundingClientRect();
|
|
2086
2097
|
if (brect.width < 50 || brect.height < 50) return;
|
|
2087
2098
|
const area = brect.width * brect.height;
|
|
2088
2099
|
if (area < MIN_AREA) return;
|
|
2089
2100
|
const hasText = (b.textContent || '').trim().length > 0;
|
|
2090
|
-
const hasMedia = b.querySelector('img, picture, svg, video, iframe') !== null;
|
|
2101
|
+
const hasMedia = b.querySelector('img, picture, svg, video, iframe, canvas, audio, object, embed') !== null;
|
|
2091
2102
|
const hasInteractive = b.querySelector('a, button, input, select, textarea') !== null;
|
|
2092
2103
|
const bcs = getComputedStyle(b);
|
|
2093
2104
|
const hasBgImg = bcs.backgroundImage && bcs.backgroundImage !== 'none';
|
|
2094
|
-
|
|
2105
|
+
const hasChildBgImg = !hasBgImg && Array.from(b.children).some(c => {
|
|
2106
|
+
const ccs = getComputedStyle(c);
|
|
2107
|
+
return ccs.backgroundImage && ccs.backgroundImage !== 'none';
|
|
2108
|
+
});
|
|
2109
|
+
if (!hasText && !hasMedia && !hasInteractive && !hasBgImg && !hasChildBgImg) {
|
|
2095
2110
|
emptyContainers.push({
|
|
2096
2111
|
id: b.id || '',
|
|
2097
2112
|
classes: Array.from(b.classList).filter(c => c.startsWith('brxe-')),
|