@wootsup/yt-builder-mcp 1.4.1 → 1.6.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/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +11 -0
- package/dist/auth.js.map +1 -1
- package/dist/cli/doctor-command.d.ts.map +1 -1
- package/dist/cli/doctor-command.js +96 -8
- package/dist/cli/doctor-command.js.map +1 -1
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -1
- package/dist/client.js.map +1 -1
- package/dist/clients/claude-code.d.ts.map +1 -1
- package/dist/clients/claude-code.js +5 -2
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/clients/claude-desktop.d.ts.map +1 -1
- package/dist/clients/claude-desktop.js +5 -2
- package/dist/clients/claude-desktop.js.map +1 -1
- package/dist/clients/cline.d.ts.map +1 -1
- package/dist/clients/cline.js +5 -2
- package/dist/clients/cline.js.map +1 -1
- package/dist/clients/codex-cli.d.ts.map +1 -1
- package/dist/clients/codex-cli.js +127 -2
- package/dist/clients/codex-cli.js.map +1 -1
- package/dist/clients/continue.d.ts.map +1 -1
- package/dist/clients/continue.js +11 -2
- package/dist/clients/continue.js.map +1 -1
- package/dist/clients/cursor.d.ts.map +1 -1
- package/dist/clients/cursor.js +5 -2
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/gemini-cli.d.ts.map +1 -1
- package/dist/clients/gemini-cli.js +5 -2
- package/dist/clients/gemini-cli.js.map +1 -1
- package/dist/clients/index.d.ts +49 -0
- package/dist/clients/index.d.ts.map +1 -1
- package/dist/clients/index.js +79 -0
- package/dist/clients/index.js.map +1 -1
- package/dist/clients/roo-code.d.ts.map +1 -1
- package/dist/clients/roo-code.js +5 -2
- package/dist/clients/roo-code.js.map +1 -1
- package/dist/clients/zed.d.ts.map +1 -1
- package/dist/clients/zed.js +22 -2
- package/dist/clients/zed.js.map +1 -1
- package/dist/diagnostics/doctor.d.ts +60 -2
- package/dist/diagnostics/doctor.d.ts.map +1 -1
- package/dist/diagnostics/doctor.js +185 -8
- package/dist/diagnostics/doctor.js.map +1 -1
- package/dist/diagnostics/startup-self-probe.d.ts +39 -0
- package/dist/diagnostics/startup-self-probe.d.ts.map +1 -0
- package/dist/diagnostics/startup-self-probe.js +87 -0
- package/dist/diagnostics/startup-self-probe.js.map +1 -0
- package/dist/gateway/essentials.d.ts +15 -6
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +51 -5
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -2
- package/dist/index.js.map +1 -1
- package/dist/net/proxy-dispatcher.d.ts +7 -0
- package/dist/net/proxy-dispatcher.d.ts.map +1 -1
- package/dist/net/proxy-dispatcher.js +7 -2
- package/dist/net/proxy-dispatcher.js.map +1 -1
- package/dist/net/site-basic-auth.d.ts +65 -0
- package/dist/net/site-basic-auth.d.ts.map +1 -0
- package/dist/net/site-basic-auth.js +118 -0
- package/dist/net/site-basic-auth.js.map +1 -0
- package/dist/proxy/bridge.d.ts +18 -1
- package/dist/proxy/bridge.d.ts.map +1 -1
- package/dist/proxy/bridge.js +23 -3
- package/dist/proxy/bridge.js.map +1 -1
- package/dist/setup-wizard-types.d.ts +9 -0
- package/dist/setup-wizard-types.d.ts.map +1 -1
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +37 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sites/client-pool.d.ts +35 -1
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +45 -1
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +65 -8
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +45 -0
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +178 -2
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +8 -0
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/health-format.d.ts +2 -0
- package/dist/tools/format/health-format.d.ts.map +1 -1
- package/dist/tools/format/health-format.js +11 -0
- package/dist/tools/format/health-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts +42 -0
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +43 -0
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/source-schema-format.d.ts +64 -0
- package/dist/tools/format/source-schema-format.d.ts.map +1 -0
- package/dist/tools/format/source-schema-format.js +161 -0
- package/dist/tools/format/source-schema-format.js.map +1 -0
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +31 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/multi-items/builders.js +2 -2
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts +2 -1
- package/dist/tools/multi-items/clean-implode-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/clean-implode-handler.js +9 -1
- package/dist/tools/multi-items/clean-implode-handler.js.map +1 -1
- package/dist/tools/multi-items/inspect-handler.d.ts +8 -0
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +48 -2
- package/dist/tools/multi-items/inspect-handler.js.map +1 -1
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +126 -28
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +21 -2
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +183 -11
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +42 -1
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +114 -5
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +26 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +38 -0
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/pool-resolve-helper.d.ts +11 -26
- package/dist/tools/pool-resolve-helper.d.ts.map +1 -1
- package/dist/tools/pool-resolve-helper.js +50 -0
- package/dist/tools/pool-resolve-helper.js.map +1 -1
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +258 -4
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts +107 -0
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +197 -2
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +54 -0
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +82 -0
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +37 -1
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +35 -5
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +39 -0
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/yt-builder-mcp/SKILL.md +237 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sparse-fields.js","sourceRoot":"","sources":["../../src/tools/sparse-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,wEAAwE;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC;KAClB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACxB,GAAG,CAAC,EAAE,CAAC;KACP,QAAQ,EAAE;KACV,QAAQ,CACL,4EAA4E;IACxE,mFAAmF;IACnF,iFAAiF;IACjF,kBAAkB,CACzB,CAAC;AAEN;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;KAChB,OAAO,EAAE;KACT,OAAO,CAAC,KAAK,CAAC;KACd,QAAQ,CACL,2EAA2E;IACvE,qEAAqE,CAC5E,CAAC;AAEN;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACrB,MAAM,EAAE;KACR,GAAG,EAAE;KACL,GAAG,CAAC,GAAG,CAAC;KACR,GAAG,CAAC,OAAO,CAAC;KACZ,QAAQ,EAAE;KACV,QAAQ,CACL,yEAAyE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,iBAAiB,CACxB,CAAC;AAEN;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IACzD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,CAAC;QACb,CAAC;IACL,CAAC;IACD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpE,CAAC;AAED,uEAAuE;AACvE,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"sparse-fields.js","sourceRoot":"","sources":["../../src/tools/sparse-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,wEAAwE;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC;KAClB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACxB,GAAG,CAAC,EAAE,CAAC;KACP,QAAQ,EAAE;KACV,QAAQ,CACL,4EAA4E;IACxE,mFAAmF;IACnF,iFAAiF;IACjF,kBAAkB,CACzB,CAAC;AAEN;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;KAChB,OAAO,EAAE;KACT,OAAO,CAAC,KAAK,CAAC;KACd,QAAQ,CACL,2EAA2E;IACvE,qEAAqE,CAC5E,CAAC;AAEN;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACrB,MAAM,EAAE;KACR,GAAG,EAAE;KACL,GAAG,CAAC,GAAG,CAAC;KACR,GAAG,CAAC,OAAO,CAAC;KACZ,QAAQ,EAAE;KACV,QAAQ,CACL,yEAAyE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,iBAAiB,CACxB,CAAC;AAEN;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IACzD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,CAAC;QACb,CAAC;IACL,CAAC;IACD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpE,CAAC;AAED,uEAAuE;AACvE,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAsB7D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAC1B,IAAY,EACZ,MAAc,EACd,QAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QACzD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACvF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO;QACH,IAAI,EAAE,QAAQ,GAAG,iBAAiB;QAClC,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM;QACnC,MAAM,EAAE,KAAK;KAChB,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CACzB,MAAS,EACT,QAA4B;IAE5B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjF,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,IAAI,GAAkB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO;QACH,GAAG,MAAM;QACT,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC;KACtD,CAAC;AACN,CAAC;AAED,wEAAwE;AAExE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IACxD,IAAI;IACJ,OAAO;IACP,MAAM;IACN,gBAAgB;IAChB,aAAa;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAsB;IAC1D,MAAM;IACN,cAAc;IACd,OAAO;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACpD,MAAM;IACN,cAAc;IACd,OAAO;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAsB;IAC1D,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IACxD,MAAM;IACN,OAAO;IACP,QAAQ;IACR,sBAAsB;CACzB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAkC,SAAS,CAAC;AAEnF,wEAAwE;AAExE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CACzB,KAAmB,EACnB,MAAqC,EACrC,SAA4B;IAE5B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAM,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAC/B,GAAM,EACN,MAAqC,EACrC,SAAwC;IAExC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChE,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAM,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAC/B,SAAwC,EACxC,QAAuC;IAEvC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,SAAS,CAAC;AACrB,CAAC;AA4BD,MAAM,UAAU,kBAAkB,CAC9B,KAAyC,EACzC,SAAwC;IAExC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,sEAAsE;IACtE,oEAAoE;IACpE,kEAAkE;IAClE,kBAAkB;IAClB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,GAAG,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAC7B,QAAwC;IAExC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,CACH,wCAAwC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC5E,iBAAiB,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC3D,CAAC;AACN,CAAC;AAED,wEAAwE;AAExE,4EAA4E;AAC5E,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACjD,MAAM;IACN,UAAU;IACV,aAAa;IACb,KAAK;IACL,UAAU;IACV,UAAU;IACV,aAAa;IACb,WAAW;CACd,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACvD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAe,EAAE,CAAC,CAAC;QACrC,GAAG;QACH,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;QAC3C,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;KAC5C,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/tools/tool-builder/results.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU1D;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gCAAgC,QAAW,CAAC;AA2BzD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,UAAU,CAM5F;
|
|
1
|
+
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/tools/tool-builder/results.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU1D;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gCAAgC,QAAW,CAAC;AA2BzD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,UAAU,CAM5F;AAyDD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CAChB,GAAG,UAAU,CAmBb;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GAAG,UAAU,CAab;AAuBD;;;;;;;GAOG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,UAAU,EAC7C,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,YAAY,GACnB,CAAC,CA6FH;AAED,wBAAgB,gBAAgB,CAC5B,aAAa,EAAE;IACX,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,UAAU,CAgBZ"}
|
|
@@ -92,6 +92,38 @@ function describeError(e) {
|
|
|
92
92
|
return { message: e.message };
|
|
93
93
|
return { message: stringify(e) };
|
|
94
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* G7 — pull the whitelisted nearest-path self-correction keys out of a thrown
|
|
97
|
+
* value's `RestError.body`, if present. GENERIC: the moment any plugin version
|
|
98
|
+
* emits the envelope on a 404, the Node HTTP path forwards it — mirroring the
|
|
99
|
+
* already-self-correcting in-process path. Only `RestError` carries a parsed
|
|
100
|
+
* upstream body; every other thrown value yields an empty envelope. The four
|
|
101
|
+
* keys are individually type-guarded (a `null` `nearest_path` is preserved as a
|
|
102
|
+
* legitimate "no candidate" signal); unknown keys never leak through.
|
|
103
|
+
*/
|
|
104
|
+
function nearestPathFromError(e) {
|
|
105
|
+
if (!(e instanceof RestError))
|
|
106
|
+
return {};
|
|
107
|
+
const body = e.body;
|
|
108
|
+
if (body === null || typeof body !== 'object' || Array.isArray(body))
|
|
109
|
+
return {};
|
|
110
|
+
const b = body;
|
|
111
|
+
const out = {};
|
|
112
|
+
if (typeof b.given === 'string')
|
|
113
|
+
out.given = b.given;
|
|
114
|
+
if (typeof b.nearest_path === 'string' || b.nearest_path === null) {
|
|
115
|
+
out.nearest_path = b.nearest_path;
|
|
116
|
+
}
|
|
117
|
+
if (typeof b.nearest_path_label === 'string')
|
|
118
|
+
out.nearest_path_label = b.nearest_path_label;
|
|
119
|
+
if (Array.isArray(b.available_paths) && b.available_paths.every((p) => typeof p === 'string')) {
|
|
120
|
+
out.available_paths = b.available_paths;
|
|
121
|
+
}
|
|
122
|
+
// N4: the canonical id-form a bare-numeric not-found should re-address with.
|
|
123
|
+
if (typeof b.expected_id_form === 'string')
|
|
124
|
+
out.expected_id_form = b.expected_id_form;
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
95
127
|
/**
|
|
96
128
|
* Render a structured error result with `context` (echoed input) and a
|
|
97
129
|
* recovery `hint`. Wave G.6.3 defense-in-depth: message is
|
|
@@ -100,12 +132,19 @@ function describeError(e) {
|
|
|
100
132
|
*/
|
|
101
133
|
export function errorResult(opts) {
|
|
102
134
|
const { message, status, code } = describeError(opts.error);
|
|
135
|
+
// G7 (self-correcting errors): forward the shared nearest-path envelope when
|
|
136
|
+
// the upstream 404 body carried it, so the agent retries IN-LOOP — the SAME
|
|
137
|
+
// contract the in-process MCP surfaces emit. Spread LAST so it rides
|
|
138
|
+
// alongside (never clobbers) error/status/code/context/hint; absent on every
|
|
139
|
+
// non-enriched failure (empty envelope → no extra keys).
|
|
140
|
+
const nearest = nearestPathFromError(opts.error);
|
|
103
141
|
return jsonResult({
|
|
104
142
|
error: sanitizeForLogs(message),
|
|
105
143
|
...(status !== undefined ? { status } : {}),
|
|
106
144
|
...(code !== undefined ? { code } : {}),
|
|
107
145
|
context: sanitizeSecrets(opts.context),
|
|
108
146
|
hint: opts.hint,
|
|
147
|
+
...nearest,
|
|
109
148
|
}, { isError: true });
|
|
110
149
|
}
|
|
111
150
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/tools/tool-builder/results.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/tools/tool-builder/results.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"dxt_version": "0.1",
|
|
3
3
|
"name": "@wootsup/yt-builder-mcp",
|
|
4
4
|
"display_name": "YT Builder MCP for YOOtheme Pro (unofficial)",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.6.0",
|
|
6
6
|
"description": "Drive your YOOtheme Pro Page Builder programmatically from Claude, Cursor, Codex, Gemini and 5 other MCP-capable AI assistants — read layouts, edit settings, add elements, bind dynamic sources. Works on WordPress and Joomla 5/6. Built for YOOtheme Pro 4.0+. Independent third-party project, not affiliated with YOOtheme GmbH.",
|
|
7
7
|
"long_description": "YT Builder MCP gives AI assistants a typed, scoped, and idempotent surface for your YOOtheme Pro Page Builder, on either WordPress or Joomla 5/6. Tools cover page discovery, layout inspection, element CRUD, source binding, and diagnostics. Bearer auth, optimistic locking via ETag, scope hierarchy (read < write < admin), and structured-error responses keep the agent safe and the workflow correct on first try. Independent third-party project — YOOtheme® is a registered trademark of YOOtheme GmbH (yootheme.com); YT Builder MCP is built by WootsUp (getimo productions) and is not affiliated with, endorsed by, or sponsored by YOOtheme.",
|
|
8
8
|
"icon": "icon.png",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wootsup/yt-builder-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "YT Builder MCP — drive your page builder from Claude, Cursor, Codex, Gemini and 5 other MCP-capable AI assistants. Built for YOOtheme Pro 4.0+. Independent third-party project, not affiliated with YOOtheme GmbH.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -12,14 +12,14 @@ description: Drive the YOOtheme Pro Page Builder on WordPress or Joomla 5/6. Dis
|
|
|
12
12
|
> WordPress and Joomla 5/6.
|
|
13
13
|
|
|
14
14
|
This skill helps AI assistants drive the YOOtheme Pro Page Builder through the
|
|
15
|
-
`@wootsup/yt-builder-mcp` server. The server catalogues
|
|
16
|
-
idempotent tools (
|
|
15
|
+
`@wootsup/yt-builder-mcp` server. The server catalogues 39 typed, scoped,
|
|
16
|
+
idempotent tools (41 callable end-to-end with the two gateways). 36 of them
|
|
17
17
|
advertised as first-class entries in `tools/list`
|
|
18
|
-
(
|
|
18
|
+
(32 essential L1 forwards + 2 direct L3 entries + 2 gateways), and 5 advanced
|
|
19
19
|
tools reachable through the gateways. The write-capable
|
|
20
20
|
`yootheme_builder_advanced` gateway routes all 5; the read-only
|
|
21
21
|
`yootheme_builder_advanced_read` gateway routes only the read-only subset
|
|
22
|
-
(page_get_schema,
|
|
22
|
+
(page_get_schema, inspect_sublayout, layout_query) and is itself
|
|
23
23
|
read-only-annotated, so MCP hosts can auto-allow pure inspection without a
|
|
24
24
|
per-call write-approval prompt. This 3-lane split keeps `tools/list` well below
|
|
25
25
|
the ~40-tool Cursor cap while every catalogued tool stays fully reachable.
|
|
@@ -53,7 +53,7 @@ Some clients (notably Claude Desktop with the `.dxt` bundle) expose **two**
|
|
|
53
53
|
entries when the user types "YT Builder MCP" into the picker:
|
|
54
54
|
|
|
55
55
|
- **`YT Builder MCP for YOOtheme Pro (unofficial)`**: the MCP **server**.
|
|
56
|
-
Provides the
|
|
56
|
+
Provides the 36 first-class tools (32 essential, 2 direct, 2 gateways).
|
|
57
57
|
The `yootheme_builder_advanced` gateway routes all 5 advanced tools; the
|
|
58
58
|
read-only `yootheme_builder_advanced_read` gateway routes the read-only
|
|
59
59
|
subset without a write-approval prompt.
|
|
@@ -81,33 +81,79 @@ The server exposes:
|
|
|
81
81
|
- **2 direct top-level tools**, always callable, always in `tools/list`:
|
|
82
82
|
`yootheme_builder_health` and `yootheme_builder_diagnose`. These are
|
|
83
83
|
the "the gateway itself might be broken" escape hatch.
|
|
84
|
-
- **
|
|
84
|
+
- **32 essential forwarded tools**: common reads + the most-used writes
|
|
85
85
|
(pages_list, pages_resolve, pages_create, pages_delete, page_dynamize, scaffold_section,
|
|
86
86
|
get_etag, element_list / add / update_settings / get / move / clone / delete,
|
|
87
|
-
page_get_layout, sources_list, element_types_list, element_type_get_schema,
|
|
87
|
+
page_get_layout, sources_list, source_get_schema, element_types_list, element_type_get_schema,
|
|
88
88
|
template_summary, inspect_multi_items_binding, sites_list, sites_test,
|
|
89
|
-
use_site,
|
|
90
|
-
page_save / page_publish
|
|
91
|
-
|
|
89
|
+
use_site, the bind→verify→save→publish chain element_bind_source /
|
|
90
|
+
element_get_binding / page_save / page_publish, and the archive-rebind /
|
|
91
|
+
refactor surface render_preview / element_set_source / rename_source /
|
|
92
|
+
template_set_type). Always advertised in
|
|
93
|
+
`tools/list` so AI clients see them first-class. `element_get_binding`
|
|
94
|
+
(B4) is L1 so the verify half of a bind is a direct call, not a
|
|
95
|
+
gateway hop. `source_get_schema` (U4-L1) is L1 so the archive/category
|
|
96
|
+
binding entry-point — introspect a source's query methods + relations +
|
|
97
|
+
the current-term archive-context convention before binding — is a direct
|
|
98
|
+
call too. `render_preview`, `element_set_source`, `rename_source` and
|
|
99
|
+
`template_set_type` (Glöckle HANDOFF-4/5) are L1 so the core write/refactor +
|
|
100
|
+
render-verify tools an agent reaches for after a taxonomy/CPT rename — set a
|
|
101
|
+
precomposed source at a pointer, render-verify the saved page is not silently
|
|
102
|
+
blank, rename a source/field template-wide, re-type an orphaned archive/single
|
|
103
|
+
template — are direct calls, not undiscoverable gateway hops. `scaffold_section`
|
|
104
|
+
creates a valid
|
|
92
105
|
section → row → column hull in one call — the easiest correct way to
|
|
93
106
|
start a layout block (content placed anywhere else is rejected by the
|
|
94
107
|
structural-hierarchy guard).
|
|
95
108
|
- **5 advanced captured tools**: everything else (page_get_schema,
|
|
96
|
-
|
|
97
|
-
and `
|
|
109
|
+
element_unbind_source, clean_implode_directives,
|
|
110
|
+
`inspect_sublayout`, and `layout_query`).
|
|
111
|
+
Reachable through one gateway tool:
|
|
98
112
|
`yootheme_builder_advanced({ tool: "<name>", arguments: { ... } })`. For
|
|
99
113
|
example, to inspect a panel/grid_item `< SUBLAYOUT`:
|
|
100
114
|
`yootheme_builder_advanced({ tool: "yootheme_builder_inspect_sublayout", arguments: { template_id, element_path } })`.
|
|
115
|
+
And to find elements by a structured filter (G5 — no expression language,
|
|
116
|
+
AND-combined `type`/`name_matches`/`has_binding`/`max_depth`/`under_section`):
|
|
117
|
+
`yootheme_builder_advanced({ tool: "yootheme_builder_layout_query", arguments: { template_id, type: "headline", has_binding: false, under_section: "Hero" } })`
|
|
118
|
+
(it's read-only, so the read gateway `yootheme_builder_advanced_read({ tool: "yootheme_builder_layout_query", … })` works too).
|
|
119
|
+
|
|
120
|
+
The core write/refactor + render-verify tools the Glöckle HANDOFF-4/5 ask for
|
|
121
|
+
are now **L1 — call them directly by name**, not through a gateway:
|
|
122
|
+
- To render-check a saved page over the authenticated channel (F5+N5 — does
|
|
123
|
+
it render, with how many items, or is it silently blank? where an external
|
|
124
|
+
cURL 401s behind staging Basic-Auth), call the now-L1
|
|
125
|
+
`yootheme_builder_render_preview({ template_id })` directly.
|
|
126
|
+
- To surgically SET a precomposed `source` + the native item-level
|
|
127
|
+
`source_extended.props` carrier on one element at a pointer, ETag-locked,
|
|
128
|
+
leaving the rest of the layout byte-unchanged (F2 — the one-call source edit
|
|
129
|
+
bind_source can't do because it cannot write `source_extended`), call the
|
|
130
|
+
now-L1
|
|
131
|
+
`yootheme_builder_element_set_source({ template_id, element_path, source: { query: { name: "categoryFaqs.taxonomyCategoryFaq", field: { name: "faq" } } }, source_extended: { props: { title: { query: { name: "#node" }, name: "title" } } }, etag })` directly.
|
|
132
|
+
- To template-wide RENAME a source/type/field name across EVERY binding in
|
|
133
|
+
one ETag-locked write — after a taxonomy/CPT rename (faq→help) breaks every
|
|
134
|
+
bound layout, preserving each binding's arguments + props + field_mappings
|
|
135
|
+
(N1 — instead of a whole-layout page_save), call the now-L1
|
|
136
|
+
`yootheme_builder_rename_source({ template_id, from: "categoryFaqs", to: "categoryHelps", source_map: { taxonomyCategoryFaq: "taxonomyCategoryHelp", faq: "help" }, field_map: { faq_title: "help_title" }, etag })` directly.
|
|
137
|
+
- To reassign which archive/single a THEME template applies to — set its
|
|
138
|
+
`type` condition (the value pages_list shows) in one ETag-locked write, the
|
|
139
|
+
step a taxonomy rename leaves orphaned (N3 — re-type
|
|
140
|
+
`taxonomy-category_faq` → `taxonomy-category_help`), call the now-L1
|
|
141
|
+
`yootheme_builder_template_set_type({ template_id, type: "taxonomy-category_help", etag })` directly.
|
|
142
|
+
|
|
143
|
+
To introspect a source's query methods + relations + the current-term
|
|
144
|
+
archive-context convention (U4-L1 — turns a ~25-call YOOtheme code-dive into
|
|
145
|
+
one call before binding on an archive/category template), call the now-L1
|
|
146
|
+
`yootheme_builder_source_get_schema({ name: "categoryFaqs" })` directly.
|
|
101
147
|
- **2 gateway tools**: `yootheme_builder_advanced` (write-capable; can route
|
|
102
148
|
into delete/unbind, so hosts gate it) and `yootheme_builder_advanced_read`
|
|
103
149
|
(read-only; routes ONLY the read-only advanced subset — page_get_schema,
|
|
104
|
-
|
|
105
|
-
auto-allow it). Prefer the read gateway for pure inspection:
|
|
150
|
+
inspect_sublayout, layout_query — and is read-only-annotated
|
|
151
|
+
so hosts auto-allow it). Prefer the read gateway for pure inspection:
|
|
106
152
|
`yootheme_builder_advanced_read({ tool: "yootheme_builder_page_get_schema", arguments: { template_id } })`.
|
|
107
153
|
|
|
108
|
-
`tools/list` therefore advertises
|
|
109
|
-
essentials + 2 L3 direct + 2 gateways. The total callable surface is
|
|
110
|
-
(
|
|
154
|
+
`tools/list` therefore advertises 36 names (32 + 2 + 2). That's 32 L1
|
|
155
|
+
essentials + 2 L3 direct + 2 gateways. The total callable surface is 41
|
|
156
|
+
(36 advertised + 5 advanced reachable through the gateways). If the AI
|
|
111
157
|
client reports "tool not found", you are almost certainly calling an
|
|
112
158
|
advanced tool by its raw name. Wrap it in
|
|
113
159
|
`yootheme_builder_advanced({ tool, arguments })` (or the read gateway for
|
|
@@ -421,10 +467,10 @@ renders dynamic items.
|
|
|
421
467
|
4. `yootheme_builder_sources_list()`: enumerate available Sources.
|
|
422
468
|
Each returns `{ name, label, origin, kind }`. Pick the one the
|
|
423
469
|
user asked for.
|
|
424
|
-
5. `
|
|
470
|
+
5. `yootheme_builder_element_get_binding({ template_id, element_path })`
|
|
425
471
|
check whether the Grid is already bound (idempotency: skip step
|
|
426
472
|
7 if `source_name` already matches the user's intent).
|
|
427
|
-
`element_get_binding` is
|
|
473
|
+
`element_get_binding` is a first-class L1 tool (B4) — call it directly.
|
|
428
474
|
6. `yootheme_builder_get_etag()`: fetch the optimistic-lock etag for
|
|
429
475
|
the upcoming mutation.
|
|
430
476
|
7. `yootheme_builder_element_bind_source({ template_id, element_path, source_name: "<name>", etag: "<etag>" })`
|
|
@@ -458,10 +504,10 @@ renders dynamic items.
|
|
|
458
504
|
- **Forgetting `etag`.** Every write requires the optimistic-lock
|
|
459
505
|
etag. On `412 Precondition Failed` re-fetch via
|
|
460
506
|
`yootheme_builder_get_etag` and retry.
|
|
461
|
-
- **Mis-routing bind vs the read helpers.** `element_bind_source`
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
L2 advanced; reach
|
|
507
|
+
- **Mis-routing bind vs the read helpers.** `element_bind_source` AND
|
|
508
|
+
its verify sibling `element_get_binding` (B4) are both first-class L1
|
|
509
|
+
tools — call them directly by name. Only `element_unbind_source` stays
|
|
510
|
+
L2 advanced; reach it through
|
|
465
511
|
`yootheme_builder_advanced({ tool, arguments })`.
|
|
466
512
|
|
|
467
513
|
**Worked example (tool-call snippet):**
|
|
@@ -477,10 +523,9 @@ yootheme_builder_element_bind_source({
|
|
|
477
523
|
// source_id: "wordpress:wp_posts" // pass ONLY when name collides
|
|
478
524
|
})
|
|
479
525
|
// Response: { path: "/0/children/2/children/0", etag: "def456", has_binding: true }
|
|
480
|
-
// Verify (
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
arguments: { template_id: "home", element_path: "/0/children/2/children/0" }
|
|
526
|
+
// Verify (direct L1 call):
|
|
527
|
+
yootheme_builder_element_get_binding({
|
|
528
|
+
template_id: "home", element_path: "/0/children/2/children/0"
|
|
484
529
|
})
|
|
485
530
|
// → { source_name: "wp_posts", source_config: { ... }, ... }
|
|
486
531
|
```
|
|
@@ -489,12 +534,12 @@ yootheme_builder_advanced({
|
|
|
489
534
|
search filter). The bind call still succeeds; the front-end Grid just
|
|
490
535
|
shows the YOOtheme "no items" placeholder. Don't treat empty render
|
|
491
536
|
as a binding failure. Verify by re-reading
|
|
492
|
-
`yootheme_builder_element_get_binding`
|
|
537
|
+
`yootheme_builder_element_get_binding` directly.
|
|
493
538
|
|
|
494
539
|
**Success criterion:** After publish, the Grid on the front-end shows
|
|
495
540
|
items from the Source (verify by item count and at least one
|
|
496
541
|
field-value spot-check). `yootheme_builder_element_get_binding`
|
|
497
|
-
|
|
542
|
+
returns the new `source_name`.
|
|
498
543
|
|
|
499
544
|
### Multi-Items renderer truth table (read before binding rich cards)
|
|
500
545
|
|
|
@@ -632,7 +677,7 @@ yootheme_builder_element_update_settings({
|
|
|
632
677
|
is preserved (same `source_name`). If the user wants a "data-free"
|
|
633
678
|
copy, follow up with
|
|
634
679
|
`yootheme_builder_advanced({ tool: "yootheme_builder_element_unbind_source", arguments: { ... } })`
|
|
635
|
-
on the new path. Verify with
|
|
680
|
+
on the new path. Verify with a direct `element_get_binding` call.
|
|
636
681
|
|
|
637
682
|
**Success criterion:** After publish,
|
|
638
683
|
`yootheme_builder_advanced({ tool: "yootheme_builder_page_get_schema", arguments: { template_id } })`
|
|
@@ -853,6 +898,16 @@ and the props payload you passed.
|
|
|
853
898
|
- **Unbind a source**: call through the gateway:
|
|
854
899
|
`yootheme_builder_advanced({ tool: "yootheme_builder_element_unbind_source", arguments: { template_id, element_path, etag, confirm: true } })`.
|
|
855
900
|
Same elicitation flow as delete.
|
|
901
|
+
- **Orient in a large template before editing** (cheapest first read):
|
|
902
|
+
`yootheme_builder_page_get_layout({ template_id, mode: "outline" })`
|
|
903
|
+
returns a token-efficient INDENTED text tree — one line per node,
|
|
904
|
+
`label ▸ type (bound: …) [sN]`. Each line carries a short handle
|
|
905
|
+
`[sN]` AND the node's real JSON-Pointer `path`. **The handle is
|
|
906
|
+
PER-READ (state-scoped): it is stable only at the etag you just read.
|
|
907
|
+
After ANY mutation (clone/move/delete/bind), re-read `mode:"outline"`
|
|
908
|
+
to get fresh handles.** Use the `path` (not the handle) as the write
|
|
909
|
+
address for `element_*` tools — the handle is only a readable alias.
|
|
910
|
+
For binding-focused work prefer `mode:"bindings_only"` instead.
|
|
856
911
|
- **Flat schema inspection** (e.g. enumerate every element path +
|
|
857
912
|
type without fetching the whole nested tree): call through the
|
|
858
913
|
gateway: `yootheme_builder_advanced({ tool: "yootheme_builder_page_get_schema", arguments: { template_id } })`.
|
|
@@ -880,24 +935,162 @@ theme settings, menu management, media library), tell them clearly:
|
|
|
880
935
|
<X> you'll need the relevant CMS REST API or direct wp-admin /
|
|
881
936
|
Joomla administrator access." Don't fabricate tool calls.
|
|
882
937
|
|
|
938
|
+
## JSON-Pointer path grammar (how to address an element)
|
|
939
|
+
|
|
940
|
+
Every element is addressed by a JSON-Pointer `path` (RFC-6901-style).
|
|
941
|
+
The read tools hand you the path; the write tools consume it. Learn the
|
|
942
|
+
grammar once and you never guess an address again.
|
|
943
|
+
|
|
944
|
+
**The shape.** A path is `/children/N` steps, optionally rooted at the
|
|
945
|
+
template:
|
|
946
|
+
|
|
947
|
+
- **Relative (rel_path):** `/children/0/children/2/children/1` — the
|
|
948
|
+
path FROM the layout root. Each `/children/N` descends one level into
|
|
949
|
+
the Nth child (0-based).
|
|
950
|
+
- **Fully-qualified:** `/templates/<template_id>/layout/children/0/...`
|
|
951
|
+
— the same address with the template prefix. `element_list` /
|
|
952
|
+
`page_get_schema` return the fully-qualified form in `path` and the
|
|
953
|
+
relative form in `rel_path`.
|
|
954
|
+
|
|
955
|
+
**You may pass EITHER form back** as `element_path` / `parent_path` —
|
|
956
|
+
the server lifts a bare `/children/...` to the fully-qualified pointer
|
|
957
|
+
for the current template (the `normalizeElementPath` rule). A leading
|
|
958
|
+
slash is optional on the relative form (`children/0` works too).
|
|
959
|
+
|
|
960
|
+
**The two special roots:**
|
|
961
|
+
|
|
962
|
+
- `""` (empty string) = the template ROOT. Use it as `parent_path: ""`
|
|
963
|
+
in `element_add` to append a top-level section.
|
|
964
|
+
- `"/"` is NOT the root in the element grammar — it normalizes to the
|
|
965
|
+
layout node itself, which is not an addressable element. Use `""` for
|
|
966
|
+
"the top".
|
|
967
|
+
|
|
968
|
+
**Reading the index.** In `/children/0/children/2/children/1`: child 0
|
|
969
|
+
of the layout, then child 2 of THAT, then child 1 of THAT. Indices are
|
|
970
|
+
positional and shift when siblings are added/removed — re-read after a
|
|
971
|
+
structural mutation before reusing a path (see the ETag handshake
|
|
972
|
+
below).
|
|
973
|
+
|
|
974
|
+
**Don't hand-build deep paths.** Enumerate with
|
|
975
|
+
`yootheme_builder_element_list` (flat `{path, rel_path, element_type}`
|
|
976
|
+
rows) or orient with `yootheme_builder_page_get_layout({ template_id,
|
|
977
|
+
mode: "outline" })` (indented `label ▸ type [sN]` tree, each line
|
|
978
|
+
carrying the real `path`). Copy the `path` from a row — never count
|
|
979
|
+
`/children/` segments by eye on a big template.
|
|
980
|
+
|
|
981
|
+
## ETag handshake and self-correcting errors
|
|
982
|
+
|
|
983
|
+
**The optimistic-lock handshake (read → write → re-read):**
|
|
984
|
+
|
|
985
|
+
1. `yootheme_builder_get_etag()` returns the current top-level ETag.
|
|
986
|
+
2. Pass it as `etag` on the FIRST write. The write succeeds and returns
|
|
987
|
+
a FRESH etag (etags rotate on every mutation) plus, since v1.4,
|
|
988
|
+
`new_etag` (the same fresh value, explicit) and `changed_paths`
|
|
989
|
+
(the JSON-Pointer(s) the write touched).
|
|
990
|
+
3. **Feed `new_etag` (or the response `etag`) into the NEXT write.** Do
|
|
991
|
+
NOT reuse the etag from the original `get_etag` — a stale etag is
|
|
992
|
+
rejected with `412 Precondition Failed` carrying `expected_etag`.
|
|
993
|
+
4. A write that REQUIRES `If-Match` but receives none is rejected `428`
|
|
994
|
+
carrying `current_etag` — read it and retry.
|
|
995
|
+
|
|
996
|
+
So a write never leaves you guessing: on a lock error the response hands
|
|
997
|
+
you the etag to use next. On success, `changed_paths` tells you exactly
|
|
998
|
+
which addresses moved, so you can re-target without re-reading the whole
|
|
999
|
+
tree.
|
|
1000
|
+
|
|
1001
|
+
**Self-correcting path errors.** When a path-addressed read cannot find
|
|
1002
|
+
the element at the path you sent, the `element_not_found` error does NOT
|
|
1003
|
+
just say "not found" — it carries:
|
|
1004
|
+
|
|
1005
|
+
- `given` — the exact pointer you sent, echoed back so you see what was rejected.
|
|
1006
|
+
- `nearest_path` — the closest VALID element pointer (path-aware
|
|
1007
|
+
distance, so an off-by-one index like `/children/9` suggests the real
|
|
1008
|
+
sibling `/children/0`). This is the write address; retry with it.
|
|
1009
|
+
- `nearest_path_label` — a HUMAN breadcrumb of that path
|
|
1010
|
+
(`Hero ▸ row ▸ column ▸ headline`), so you (and the user) can see WHAT
|
|
1011
|
+
the suggestion points at without decoding the pointer.
|
|
1012
|
+
- `available_paths` — a small bounded list of the nearest valid pointers
|
|
1013
|
+
(not a full dump), to pick from when `nearest_path` is not the one.
|
|
1014
|
+
|
|
1015
|
+
Use the suggestion to fix your NEXT call in-loop — you almost never need
|
|
1016
|
+
to re-read the entire layout after a wrong-path error.
|
|
1017
|
+
|
|
1018
|
+
> Scope (since v1.4.1): the self-correcting enrichment covers **every**
|
|
1019
|
+
> path-addressed read — `yootheme_builder_element_get`,
|
|
1020
|
+
> `yootheme_builder_inspect_sublayout`,
|
|
1021
|
+
> `yootheme_builder_inspect_multi_items_binding` and
|
|
1022
|
+
> `yootheme_builder_element_get_binding` — on both the embedded (in-process)
|
|
1023
|
+
> surfaces and, when the plugin emits it, the Node HTTP-transport 404. All four
|
|
1024
|
+
> reuse the ONE shared `nearestElementPath` + `PathHumanizer` core, so the
|
|
1025
|
+
> `{given, nearest_path, nearest_path_label, available_paths}` envelope is
|
|
1026
|
+
> byte-identical across WordPress and Joomla.
|
|
1027
|
+
|
|
1028
|
+
## Dynamize an existing section (designed layout → live data, one call)
|
|
1029
|
+
|
|
1030
|
+
**Goal:** Take a section you (or the customer) already designed by hand
|
|
1031
|
+
and make it data-driven — repeating over a source's items — WITHOUT
|
|
1032
|
+
rebuilding it node by node.
|
|
1033
|
+
|
|
1034
|
+
Use `yootheme_builder_page_dynamize`. It copies the referenced layout
|
|
1035
|
+
byte-identically and swaps ONLY what you map, so the design (spacing,
|
|
1036
|
+
styles, the `#parent` bindings) survives untouched.
|
|
1037
|
+
|
|
1038
|
+
**Canonical tool-call sequence (snake_case):**
|
|
1039
|
+
|
|
1040
|
+
1. `yootheme_builder_get_etag()`: current lock.
|
|
1041
|
+
2. `yootheme_builder_template_summary({ template_id })` (or
|
|
1042
|
+
`yootheme_builder_page_get_layout({ template_id, mode: "outline" })`):
|
|
1043
|
+
find the REFERENCE you will dynamize — a `section_name` (a named
|
|
1044
|
+
section from the summary) or an `element_path`.
|
|
1045
|
+
3. `yootheme_builder_sources_list()`: get the `list_source_name` to bind
|
|
1046
|
+
(the published source that yields the items).
|
|
1047
|
+
4. `yootheme_builder_page_dynamize({ template_id, section_name: "<name>", list_source_name: "<source>", leaf_map: { "<original-leaf-field>": "<flat-flow-field>" }, etag })`.
|
|
1048
|
+
|
|
1049
|
+
**How the mapping works:**
|
|
1050
|
+
|
|
1051
|
+
- `leaf_map` keys are the ORIGINAL leaf field-names in the designed
|
|
1052
|
+
section; values are the flat flow field they should now read. The
|
|
1053
|
+
`#parent` binding and any tuned props are kept.
|
|
1054
|
+
- A section with SEVERAL source blocks dynamizes in ONE call via
|
|
1055
|
+
`source_map` — an array of `{ match, source_name, leaf_map }`, one
|
|
1056
|
+
entry per block.
|
|
1057
|
+
- For sub-query panels, key a `leaf_map` entry by
|
|
1058
|
+
`"<subquery>.<leaf>"`.
|
|
1059
|
+
- `page_dynamize` requires `page.title`. It returns the page plus a
|
|
1060
|
+
`summary`, and (since v1.4) `changed_paths` + `new_etag` like every
|
|
1061
|
+
other write.
|
|
1062
|
+
|
|
1063
|
+
**Common pitfalls:**
|
|
1064
|
+
|
|
1065
|
+
- **Binding Multi-Items on the container.** Bind the source + Multi-Items
|
|
1066
|
+
on the `*_item` CHILD, never on the grid/list container — see the
|
|
1067
|
+
Multi-Items renderer truth table above. `page_dynamize` follows that
|
|
1068
|
+
rule for you when you hand it the right reference.
|
|
1069
|
+
- **Hand-editing the JSON instead.** Don't reconstruct the section with
|
|
1070
|
+
`element_add` calls to "make it dynamic" — that loses the design.
|
|
1071
|
+
`page_dynamize` is the supported one-call path.
|
|
1072
|
+
- **Reusing a stale etag.** Feed `new_etag` from the response into your
|
|
1073
|
+
next write.
|
|
1074
|
+
|
|
883
1075
|
## Appendix: Tool Catalog (auto-generated)
|
|
884
1076
|
|
|
885
1077
|
<!-- TOOL-CATALOG:BEGIN -->
|
|
886
1078
|
|
|
887
|
-
**
|
|
1079
|
+
**39 catalogued tools** plus the `yootheme_builder_advanced` (write) + `yootheme_builder_advanced_read` (read-only) gateways = **41 reachable via `tools/list`** (32 L1 + 2 L3 + 2 gateways = 36 advertised; the gateways route to 5 additional advanced tools, bringing the total to 41 callable). Generated by `scripts/extract-tools.mjs` from the compiled `buildAllTools()` registry. Do not hand-edit this section; re-run `npm run build && node scripts/extract-tools.mjs` after changing tool definitions.
|
|
888
1080
|
|
|
889
1081
|
| Tool | Kind | Input keys | Description |
|
|
890
1082
|
| --- | --- | --- | --- |
|
|
891
1083
|
| `yootheme_builder_clean_implode_directives` | destructive | `confirm`, `element_path`, `etag`, `site_id`, `template_id` | Strips `props.source.props.*.implode` directives from an element binding. Returns audit log + new ETag. Idempotent at the server (cleaned_count: 0 when nothing to remove) but classed as destructive because the affected binding cannot be restored without re-mapping. Always ask the user to confirm first, then call again with `confirm: true`. Requires ETag. Operates on the default site unless site_id is provided. |
|
|
892
1084
|
| `yootheme_builder_diagnose` | read+idempotent | `site_id` | Full diagnostic: /health + authenticated /etag probe. Returns site_url, home_url, plugin reachability, Bearer validity in one call. First call when you need to know where the site lives. For per-template URLs see pages_list. Operates on the default site unless site_id is provided. |
|
|
893
1085
|
| `yootheme_builder_element_add` | mutating | `children`, `element_type`, `etag`, `index`, `parent_path`, `position`, `props`, `site_id`, `template_id`, `type_name` | Add a new element to a template. Provide `parent_path` (or "" for root), `element_type` (e.g. "headline", "text", "grid"), and optional `props` / `children`. Appends by default; pass `index` (0 = first) to insert before siblings. Returns the new element's JSON-Pointer path. Requires ETag. Operates on the default site unless site_id is provided. |
|
|
894
|
-
| `yootheme_builder_element_bind_source` | idempotent | `bindingLevel`, `element_path`, `etag`, `field_mappings`, `site_id`, `source_id`, `source_name`, `template_id` | Binds a Builder source to an element (canonical shape: `source` top-level). Pass `field_mappings` in the SAME call; bindingLevel "item" binds a container's first *_item child. Leaf under an iterating *_item → CONSOLIDATE onto item slots (409 slot_collision if taken/not a slot); leaf under a #parent fragment → INHERIT (`__node_item__`); standalone renders empty. List on a grid_item with children → iterator_is_leaf_renderer. Map: bind `map_item`, map `location` to a "lat,lng" field or no markers. Requires ETag. Call directly. Operates on the default site unless site_id is provided. |
|
|
1086
|
+
| `yootheme_builder_element_bind_source` | idempotent | `arguments`, `bindingLevel`, `directives`, `element_path`, `etag`, `field`, `field_mappings`, `query_arguments`, `relation`, `site_id`, `source_id`, `source_name`, `template_id` | Binds a Builder source to an element (canonical shape: `source` top-level). Pass `field_mappings` in the SAME call; bindingLevel "item" binds a container's first *_item child. Leaf under an iterating *_item → CONSOLIDATE onto item slots (409 slot_collision if taken/not a slot); leaf under a #parent fragment → INHERIT (`__node_item__`); standalone renders empty. List on a grid_item with children → iterator_is_leaf_renderer. Map: bind `map_item`, map `location` to a "lat,lng" field or no markers. Requires ETag. Call directly. Operates on the default site unless site_id is provided. |
|
|
895
1087
|
| `yootheme_builder_element_clone` | mutating | `element_path`, `etag`, `site_id`, `template_id` | Clone an element as a sibling (same parent, immediately after the source). Returns the new element's path. Requires ETag. Operates on the default site unless site_id is provided. |
|
|
896
1088
|
| `yootheme_builder_element_delete` | destructive | `confirm`, `element_path`, `etag`, `site_id`, `template_id` | PERMANENTLY delete an element + children. Cannot be undone. Pass `confirm: true` (boolean) AND a fresh ETag. If `preview:true` returns despite confirm, check `details.received_confirm` — strings/numbers accepted, but boolean is canonical. Operates on the default site unless site_id is provided. |
|
|
897
1089
|
| `yootheme_builder_element_get` | read+idempotent | `element_path`, `site_id`, `template_id` | Get the full element object at a specific JSON-Pointer path, including props and children. Use yootheme_builder_element_list to discover paths. Operates on the default site unless site_id is provided. |
|
|
898
1090
|
| `yootheme_builder_element_get_binding` | read+idempotent | `element_path`, `site_id`, `template_id` | Read the source binding attached to an element — the bound source name, the field-mappings (which source field feeds which element prop) and the query arguments/directives. Returns the empty object if the element is not bound. Operates on the default site unless site_id is provided. |
|
|
899
|
-
| `yootheme_builder_element_list` | read+idempotent | `cursor`, `depth`, `fields`, `limit`, `root_path`, `site_id`, `template_id` | List elements in a template as a flat array with JSON-Pointer paths + types. Scope with `root_path`/`depth` for a subtree, paginate with `limit`/`cursor` for large templates. `fields[]` narrows each row. Operates on the default site unless site_id is provided. |
|
|
1091
|
+
| `yootheme_builder_element_list` | read+idempotent | `cursor`, `depth`, `fields`, `limit`, `max_chars`, `root_path`, `site_id`, `template_id` | List elements in a template as a flat array with JSON-Pointer paths + types. Scope with `root_path`/`depth` for a subtree, paginate with `limit`/`cursor` for large templates. `fields[]` narrows each row; `max_chars` bounds the text output. Operates on the default site unless site_id is provided. |
|
|
900
1092
|
| `yootheme_builder_element_move` | idempotent | `element_path`, `etag`, `site_id`, `template_id`, `to_index`, `to_parent_path` | Move an element to a new parent + index in the tree. Useful for reordering or reparenting (e.g. moving a card from one grid column to another). Requires ETag. Operates on the default site unless site_id is provided. |
|
|
1093
|
+
| `yootheme_builder_element_set_source` | idempotent | `element_path`, `etag`, `site_id`, `source`, `source_extended`, `template_id` | Surgically SET a precomposed `source` (+ optional `source_extended.props`) on ONE element at a pointer, ETag-locked, leaving every OTHER node unchanged (no 14 KB page_save). Use this — not element_bind_source — when you have the exact source shape OR need `source_extended.props`, the native Multi-Items item-mapping carrier bind_source cannot write. E.g. an FAQ accordion scoped to the term: source.query.name="categoryFaqs.taxonomyCategoryFaq", field={name:"faq"}, source_extended.props maps title/content to #node. ETag req. Operates on the default site unless site_id is provided. |
|
|
901
1094
|
| `yootheme_builder_element_type_get_schema` | read+idempotent | `element_type`, `site_id`, `type_name` | **Call before every `element_add` / `_update_settings`** — unknown prop keys are silently dropped server-side, so guessing fails quietly. Returns `{name,type,label?}` field descriptors. Use `element_type`; `type_name` is DEPRECATED. Operates on the default site unless site_id is provided. |
|
|
902
1095
|
| `yootheme_builder_element_types_list` | read+idempotent | `fields`, `site_id` | List element types registered on this site (built-ins + YOOessentials/uEssentials extras). Names feed `element_type` of element_add. Pass `fields[]` to narrow each row. Keywords: "slider"/"carousel" → `slideshow`/`panel-slider`/`overlay-slider`. Prop keys differ per element (grid_item `title` vs headline `content`) — use element_type_get_schema before element_add/bind. Operates on the default site unless site_id is provided. |
|
|
903
1096
|
| `yootheme_builder_element_unbind_source` | destructive | `confirm`, `element_path`, `etag`, `site_id`, `template_id` | Remove the source binding from an element. Clears `props.source`. Destructive in the sense that it may break dynamic-content rendering — always ask the user to confirm. Requires ETag. Operates on the default site unless site_id is provided. |
|
|
@@ -906,19 +1099,24 @@ Joomla administrator access." Don't fabricate tool calls.
|
|
|
906
1099
|
| `yootheme_builder_health` | read+idempotent | `site_id` | Check plugin installed/reachable. Returns plugin version, YT Pro version, REST endpoints. Authenticated payload adds site_url + home_url for deep-linking. See yootheme_builder_diagnose for Bearer-validity + connectivity summary. Operates on the default site unless site_id is provided. |
|
|
907
1100
|
| `yootheme_builder_inspect_multi_items_binding` | read+idempotent | `element_path`, `site_id`, `template_id` | Reports Multi-Items binding state: container/item pair (grid↔grid_item, slideshow↔slideshow_item, map↔map_item, …), current binding level (none\|container\|item), and a recommended_fix when the binding sits on the container instead of the child. For map/map_item, a bound item without a `location` ("lat,lng") field is flagged as a blocking map_location_warning (renders 0 markers). A List on a grid_item with nested children → blocking iterator_is_leaf_renderer (children never render). Operates on the default site unless site_id is provided. |
|
|
908
1101
|
| `yootheme_builder_inspect_sublayout` | read+idempotent | `element_path`, `site_id`, `template_id` | Inspects a panel/grid_item `< SUBLAYOUT`: lists the `fragment` subtree bindable leaves (with JSON-Pointer paths to bind on — NOT the container) and the render-time inner grid. Flags `ungated_grid_prop` (blocking): grid props set but the gate (title_align=left / image_align=left\|right) unsatisfied → silent no-op. For container↔item binding see inspect_multi_items_binding. Operates on the default site unless site_id is provided. |
|
|
1102
|
+
| `yootheme_builder_layout_query` | read+idempotent | `cursor`, `fields`, `has_binding`, `limit`, `max_chars`, `max_depth`, `name_matches`, `site_id`, `template_id`, `type`, `under_section` | Find elements in a template by a structured filter — no syntax, no expression language. AND-combine any of: `type` (one type or a list), `name_matches` (case-insensitive substring of the element name), `has_binding` (bound vs unbound), `max_depth` (cap descent — 0 = top-level), `under_section` (only nodes inside a named section). Returns matching rows {path, element_type, label, has_binding}; paginate with `limit`/`cursor`, narrow rows with `fields[]`, bound text with `max_chars`. Operates on the default site unless site_id is provided. |
|
|
909
1103
|
| `yootheme_builder_page_dynamize` | mutating | `conditions`, `element_path`, `etag`, `leaf_map`, `list_source_name`, `page`, `remove_leaves`, `section_name`, `site_id`, `source_map`, `template_id` | One-call way to dynamize a designed section: copies the layout byte-identically and swaps only what you map. Use INSTEAD of hand-editing JSON. Give a REFERENCE (section_name from template_summary, or element_path) + list_source_name + a leaf_map (original leaf field-name → flat flow field; #parent + tuned props kept). A section with several source blocks (Played/Next/Later) dynamizes in ONE call via source_map ({match, source_name, leaf_map?}[]). Sub-query panels: key by "<subquery>.<leaf>". Returns page + `summary`. Requires page.title. Operates on the default site unless site_id is provided. |
|
|
910
|
-
| `yootheme_builder_page_get_layout` | read+idempotent | `fields`, `flat`, `force`, `mode`, `post_id`, `site_id`, `template_id`, `url` | Get the layout tree for one template — address it by `template_id` (from pages_list), `post_id` (numeric post/article id), or `url
|
|
911
|
-
| `yootheme_builder_page_get_schema` | read+idempotent | `post_id`, `site_id`, `template_id`, `url` | Get the flat schema for a template — nodes with their JSON-Pointer paths and element types. Lighter than page_get_layout, enough to locate elements before editing. Address
|
|
1104
|
+
| `yootheme_builder_page_get_layout` | read+idempotent | `cursor`, `fields`, `flat`, `force`, `max_chars`, `mode`, `post_id`, `site_id`, `template_id`, `url` | Get the layout tree for one template — address it by `template_id` (from pages_list), `post_id` (numeric post/article id), or `url`. For dynamize/bind prefer `mode:"bindings_only"` (binding skeleton, no style props). Default `mode:"full"` returns nested `{layout, etag}`; `flat:true` gives a depth-first `{elements:[...]}` array (with `fields[]`). A repeated unchanged read auto-skips (`force:true` re-fetches). `max_chars` bounds the text; a clipped read returns `next_cursor` (pass back as `cursor`) to page the rest. Operates on the default site unless site_id is provided. |
|
|
1105
|
+
| `yootheme_builder_page_get_schema` | read+idempotent | `fields`, `max_chars`, `post_id`, `site_id`, `template_id`, `url` | Get the flat schema for a template — nodes with their JSON-Pointer paths and element types. Lighter than page_get_layout, enough to locate elements before editing. Address by `template_id` (pages_list), `post_id`, or `url`. `fields[]` slims each node; `max_chars` bounds output. Operates on the default site unless site_id is provided. |
|
|
912
1106
|
| `yootheme_builder_page_publish` | idempotent | `etag`, `site_id`, `template_id` | Publish a template — persist state, flush YT + WP caches, snapshot the published-state ETag. ETag optional — when provided, 412 on conflict; when omitted, last-write-wins. Recommended for collaborative edits. Operates on the default site unless site_id is provided. |
|
|
913
|
-
| `yootheme_builder_page_save` | idempotent | `etag`, `layout`, `site_id`, `template_id` | Re-run save-transforms + flush caches. Optionally
|
|
1107
|
+
| `yootheme_builder_page_save` | idempotent | `dry_run`, `etag`, `layout`, `site_id`, `template_id` | Re-run save-transforms + flush caches. Optionally REPLACE the template tree by passing the INNER {type:"layout",children:[...]} tree as `layout` — NOT the full template node page_get_layout returns (rejected 422, would blank the page). Validated + ETag-locked; on reject nothing persists. An unrenderable layout is refused PRE-WRITE (422). `dry_run:true` preflights; the success response carries `previous_layout` for 1-call rollback. Omit `layout` to re-run transforms only. ETag optional (412 on conflict; else last-write-wins). Operates on the default site unless site_id is provided. |
|
|
914
1108
|
| `yootheme_builder_pages_create` | idempotent | `dry_run`, `layout`, `menu_item`, `published`, `site_id`, `slug`, `status`, `title` | Create a page (WordPress) or article (Joomla 5/6) with a YOOtheme per-page layout. Required: title. Optional: slug, status (default draft), published (default false → live on true: WP publish / Joomla state 1), layout (JSON), menu_item (Joomla SEF route), dry_run (preflight, no persist). Returns page_id (WP) / article_id (Joomla), slug, template_id (page:{id} or article:{id}), etag, warnings. Joomla: a published article has NO SEF route until a menu item points at it — pass menu_item, else frontend_url may 404. Operates on the default site unless site_id is provided. |
|
|
915
1109
|
| `yootheme_builder_pages_delete` | idempotent | `confirm`, `force`, `post_id`, `site_id` | Delete a page (WordPress) or article (Joomla 5/6) with its YOOtheme per-page layout. Requires confirm:true (gate against accidental deletion). Default: trash (recoverable). force:true: permanent delete. Refuses non-page/article types with 403 (Layer 9 defense). Returns deleted:true, page_id (WP) / article_id (Joomla), force_deleted, bumped etag. Operates on the default site unless site_id is provided. |
|
|
916
|
-
| `yootheme_builder_pages_list` | read+idempotent | `cursor`, `fields`, `label_contains`, `limit`, `site_id` | List pages, templates, and layouts in the YOOtheme Pro builder (template_id, label, type, element count, frontend_url, builder_url per row). CALL THIS FIRST to discover template IDs before page_get_layout / element_list / page_get_schema. Paginates: up to `limit` rows (default 50) plus `total` and a `next_cursor` (pass it back as `cursor`) when more remain. Filter with `label_contains`. Slim rows with `fields:["id","label"]`. Operates on the default site unless site_id is provided. |
|
|
917
|
-
| `yootheme_builder_pages_resolve` | read+idempotent | `site_id`, `url` | Resolve a public page/article URL to the template_id that renders it — paste a URL, get a layout-addressable id in one call. Returns {template_id (page:{id}/article:{id}), post_id, type, frontend_url}. 404s with a hint for THEME-template URLs (use pages_list instead). page_get_layout / page_get_schema also accept a `url` param directly.
|
|
1110
|
+
| `yootheme_builder_pages_list` | read+idempotent | `cursor`, `fields`, `label_contains`, `limit`, `max_chars`, `site_id` | List pages, templates, and layouts in the YOOtheme Pro builder (template_id, label, type, element count, frontend_url, builder_url per row). CALL THIS FIRST to discover template IDs before page_get_layout / element_list / page_get_schema. Paginates: up to `limit` rows (default 50) plus `total` and a `next_cursor` (pass it back as `cursor`) when more remain. Filter with `label_contains`. Slim rows with `fields:["id","label"]`; bound output with `max_chars`. Operates on the default site unless site_id is provided. |
|
|
1111
|
+
| `yootheme_builder_pages_resolve` | read+idempotent | `site_id`, `url` | Resolve a public page/article URL to the template_id that renders it — paste a URL, get a layout-addressable id in one call. Returns {template_id (page:{id}/article:{id}), post_id, type, frontend_url}. 404s with a hint for THEME-template URLs (use pages_list instead). page_get_layout / page_get_schema also accept a `url` param directly. Operates on the default site unless site_id is provided. |
|
|
1112
|
+
| `yootheme_builder_rename_source` | idempotent | `etag`, `field_map`, `from`, `site_id`, `source_map`, `template_id`, `to` | Template-wide RENAME of a source / type / field name across EVERY binding in a template, in ONE ETag-locked write (not a whole-layout page_save) — preserving each binding's arguments, props and field_mappings. Use after a taxonomy/CPT rename (faq→help) breaks every bound layout. Pass `from`/`to` for one source, and/or `source_map`/`field_map` to rename a relation + its field tokens together; the dotted "<source>.<relation>" form is rewritten segment-by-segment. Returns {replaced_count, changed_paths, new_etag}. ETag req. Operates on the default site unless site_id is provided. |
|
|
1113
|
+
| `yootheme_builder_render_preview` | read+idempotent | `site_id`, `template_id`, `url` | Render-check a saved template over the authenticated channel — does it actually render, with how many items, or is it blank? Address by `template_id` (from pages_list) OR `url` (a public page URL, resolved for you). Returns {rendered, item_count, empty, error?, cache_purge_hint}. Use AFTER a page_save / element_bind_source to confirm the live page is not silently empty (a bad binding "saves" then renders blank); the swallowed YOOtheme render error is surfaced in `error`. Read-only — renders without persisting. Operates on the default site unless site_id is provided. |
|
|
918
1114
|
| `yootheme_builder_scaffold_section` | mutating | `columns`, `etag`, `site_id`, `template_id` | Create a VALID section → row → column hull in ONE atomic call and return the column JSON-Pointer path(s) to drop content into. This is the EASIEST correct way to start a new layout block: YOOtheme content must live in section → row → column, and adding content anywhere else (root, bare section, bare row) is rejected. Pass `columns` (1-12, default 1) for a multi-column row. Requires ETag. Operates on the default site unless site_id is provided. |
|
|
919
1115
|
| `yootheme_builder_sites_list` | read+idempotent | `site_id` | List all sites configured in this multi-site MCP installation. Returns site_id + URL + platform (wordpress\|joomla) + default flag per row. CALL THIS FIRST when working with a fresh MCP connection to discover available site_ids before targeting one with any other tool. Read-only, no REST calls. Keywords: list sites, list connections, list installations, discover site_id, available sites, configured sites, what sites exist, multi-site index. (site_id is accepted for schema-uniformity but ignored by this tool.) |
|
|
920
1116
|
| `yootheme_builder_sites_test` | read+idempotent | `site_id` | Verify connectivity to ONE site: probes /health (no auth) + /etag (auth) in parallel; returns plugin_reachable + bearer_valid. `site_id` is REQUIRED. Use sites_list to find IDs. |
|
|
921
|
-
| `
|
|
1117
|
+
| `yootheme_builder_source_get_schema` | read+idempotent | `max_chars`, `name`, `site_id` | Introspect ONE data source: its query methods + arguments + RELATIONS (e.g. Term→Posts: categoryFaqs.taxonomyCategoryFaq → field "faq") + a provides_archive_context flag (id:0 = current archive term, auto-scoped). CALL BEFORE binding on an archive/category template — turns a ~25-call code-dive into one. Keywords: source schema, query methods, relations, Term to Posts, current term, archive context, taxonomy binding. Get `name` from yootheme_builder_sources_list. Operates on the default site unless site_id is provided. |
|
|
1118
|
+
| `yootheme_builder_sources_list` | read+idempotent | `cursor`, `fields`, `group`, `kind`, `limit`, `max_chars`, `name_contains`, `site_id` | List all data sources, feeds, and dynamic content sources available in the YOOtheme Pro builder. Returns name + label + origin (apimapper / wordpress / joomla / essentials) per source. CALL THIS BEFORE binding any element to a data source. Then bind directly with yootheme_builder_element_bind_source. Keywords: list sources, list feeds, list bindings, dynamic content, what sources exist. Paginates (`limit`/`cursor`/`total`); scope with `group`/`kind`/`name_contains`; slim with `fields[]`; bound output with `max_chars`. Operates on the default site unless site_id is provided. |
|
|
1119
|
+
| `yootheme_builder_template_set_type` | idempotent | `etag`, `site_id`, `template_id`, `type` | Reassign which archive/single a YOOtheme THEME template applies to — set its `type` condition (the value pages_list shows) in ONE ETag-locked write. Use after a taxonomy/CPT rename orphans a template (e.g. re-type "taxonomy-category_faq" → "taxonomy-category_help", "single-gloeckle_faq" → "single-gloeckle_help"). Returns {type, previous_type, new_etag} — previous_type is the read of the prior assignment, folded in. THEME templates only: a page:/article: layout is refused (422). ETag req. Operates on the default site unless site_id is provided. |
|
|
922
1120
|
| `yootheme_builder_template_summary` | read+idempotent | `site_id`, `template_id` | Token-efficient template overview: element counts by type, binding count, max nesting depth, and named landmark sections — computed server-side in one call. Use this to grasp a large template before pulling element_list or page_get_layout. Example: yootheme_builder_template_summary({ template_id: "default" }). Operates on the default site unless site_id is provided. |
|
|
923
1121
|
| `yootheme_builder_use_site` | idempotent | `probe`, `site_id` | Switch the ACTIVE site for this multi-site session. After this call, every tool that omits `site_id` targets the site you picked here. NOTE: this default is PROCESS-WIDE — concurrent clients sharing this MCP server inherit it; pass `site_id` per call for isolation between parallel agents. Runs a /health + /etag probe by default; pass `probe: false` to switch offline. A degraded site is a soft warning (the switch still happens). `site_id` is REQUIRED. Keywords: switch/change/set active/target site, select installation, use profile. Use yootheme_builder_sites_list first to find IDs. |
|
|
924
1122
|
|