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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. 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.0",
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 depuis le registre runtime Bricks. Sans `element`, retourne le catalogue compact. Avec `element` (ex: button, image, form), retourne les contrôles/settings de cet élément + les settings hérités communs si includeInherited=true.",
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). Utile pour des animations, des polices spécifiques à cette page seulement, etc.",
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: { type: "number", description: "ID de la page" },
1074
- customCss: { type: "string", description: "CSS de la page (sera injecté dans <head> uniquement sur cette page)" },
1075
- customScripts: { type: "string", description: "Scripts/HTML de la page (injectés dans <head>)" },
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
- if (!hasText && !hasMedia && !hasInteractive && !hasBgImg) {
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-')),