@wootsup/yt-builder-mcp 1.1.0 → 1.1.6

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 (400) hide show
  1. package/README.md +56 -55
  2. package/manifest.json +15 -15
  3. package/package.json +2 -2
  4. package/skills/yt-builder-mcp/SKILL.md +130 -121
  5. package/dist/auth.d.ts +0 -119
  6. package/dist/auth.d.ts.map +0 -1
  7. package/dist/auth.js +0 -226
  8. package/dist/auth.js.map +0 -1
  9. package/dist/client.d.ts +0 -84
  10. package/dist/client.d.ts.map +0 -1
  11. package/dist/client.js +0 -151
  12. package/dist/client.js.map +0 -1
  13. package/dist/clients/claude-code.d.ts +0 -18
  14. package/dist/clients/claude-code.d.ts.map +0 -1
  15. package/dist/clients/claude-code.js +0 -53
  16. package/dist/clients/claude-code.js.map +0 -1
  17. package/dist/clients/claude-desktop.d.ts +0 -19
  18. package/dist/clients/claude-desktop.d.ts.map +0 -1
  19. package/dist/clients/claude-desktop.js +0 -56
  20. package/dist/clients/claude-desktop.js.map +0 -1
  21. package/dist/clients/cline.d.ts +0 -26
  22. package/dist/clients/cline.d.ts.map +0 -1
  23. package/dist/clients/cline.js +0 -80
  24. package/dist/clients/cline.js.map +0 -1
  25. package/dist/clients/codex-cli.d.ts +0 -42
  26. package/dist/clients/codex-cli.d.ts.map +0 -1
  27. package/dist/clients/codex-cli.js +0 -194
  28. package/dist/clients/codex-cli.js.map +0 -1
  29. package/dist/clients/continue.d.ts +0 -13
  30. package/dist/clients/continue.d.ts.map +0 -1
  31. package/dist/clients/continue.js +0 -52
  32. package/dist/clients/continue.js.map +0 -1
  33. package/dist/clients/cursor.d.ts +0 -12
  34. package/dist/clients/cursor.d.ts.map +0 -1
  35. package/dist/clients/cursor.js +0 -38
  36. package/dist/clients/cursor.js.map +0 -1
  37. package/dist/clients/gemini-cli.d.ts +0 -18
  38. package/dist/clients/gemini-cli.d.ts.map +0 -1
  39. package/dist/clients/gemini-cli.js +0 -44
  40. package/dist/clients/gemini-cli.js.map +0 -1
  41. package/dist/clients/home.d.ts +0 -14
  42. package/dist/clients/home.d.ts.map +0 -1
  43. package/dist/clients/home.js +0 -20
  44. package/dist/clients/home.js.map +0 -1
  45. package/dist/clients/index.d.ts +0 -52
  46. package/dist/clients/index.d.ts.map +0 -1
  47. package/dist/clients/index.js +0 -72
  48. package/dist/clients/index.js.map +0 -1
  49. package/dist/clients/roo-code.d.ts +0 -23
  50. package/dist/clients/roo-code.d.ts.map +0 -1
  51. package/dist/clients/roo-code.js +0 -69
  52. package/dist/clients/roo-code.js.map +0 -1
  53. package/dist/clients/zed.d.ts +0 -12
  54. package/dist/clients/zed.d.ts.map +0 -1
  55. package/dist/clients/zed.js +0 -41
  56. package/dist/clients/zed.js.map +0 -1
  57. package/dist/errors/hints.d.ts +0 -51
  58. package/dist/errors/hints.d.ts.map +0 -1
  59. package/dist/errors/hints.js +0 -95
  60. package/dist/errors/hints.js.map +0 -1
  61. package/dist/errors/mask.d.ts +0 -35
  62. package/dist/errors/mask.d.ts.map +0 -1
  63. package/dist/errors/mask.js +0 -49
  64. package/dist/errors/mask.js.map +0 -1
  65. package/dist/errors/sanitize.d.ts +0 -31
  66. package/dist/errors/sanitize.d.ts.map +0 -1
  67. package/dist/errors/sanitize.js +0 -100
  68. package/dist/errors/sanitize.js.map +0 -1
  69. package/dist/errors.d.ts +0 -42
  70. package/dist/errors.d.ts.map +0 -1
  71. package/dist/errors.js +0 -61
  72. package/dist/errors.js.map +0 -1
  73. package/dist/gateway/advanced-tool/discovery.d.ts +0 -19
  74. package/dist/gateway/advanced-tool/discovery.d.ts.map +0 -1
  75. package/dist/gateway/advanced-tool/discovery.js +0 -53
  76. package/dist/gateway/advanced-tool/discovery.js.map +0 -1
  77. package/dist/gateway/advanced-tool/domains.d.ts +0 -47
  78. package/dist/gateway/advanced-tool/domains.d.ts.map +0 -1
  79. package/dist/gateway/advanced-tool/domains.js +0 -94
  80. package/dist/gateway/advanced-tool/domains.js.map +0 -1
  81. package/dist/gateway/advanced-tool/execute.d.ts +0 -29
  82. package/dist/gateway/advanced-tool/execute.d.ts.map +0 -1
  83. package/dist/gateway/advanced-tool/execute.js +0 -54
  84. package/dist/gateway/advanced-tool/execute.js.map +0 -1
  85. package/dist/gateway/advanced-tool/index.d.ts +0 -36
  86. package/dist/gateway/advanced-tool/index.d.ts.map +0 -1
  87. package/dist/gateway/advanced-tool/index.js +0 -39
  88. package/dist/gateway/advanced-tool/index.js.map +0 -1
  89. package/dist/gateway/advanced-tool/register.d.ts +0 -18
  90. package/dist/gateway/advanced-tool/register.d.ts.map +0 -1
  91. package/dist/gateway/advanced-tool/register.js +0 -69
  92. package/dist/gateway/advanced-tool/register.js.map +0 -1
  93. package/dist/gateway/advanced-tool.d.ts +0 -13
  94. package/dist/gateway/advanced-tool.d.ts.map +0 -1
  95. package/dist/gateway/advanced-tool.js +0 -13
  96. package/dist/gateway/advanced-tool.js.map +0 -1
  97. package/dist/gateway/capturing-server.d.ts +0 -117
  98. package/dist/gateway/capturing-server.d.ts.map +0 -1
  99. package/dist/gateway/capturing-server.js +0 -103
  100. package/dist/gateway/capturing-server.js.map +0 -1
  101. package/dist/gateway/essentials.d.ts +0 -49
  102. package/dist/gateway/essentials.d.ts.map +0 -1
  103. package/dist/gateway/essentials.js +0 -92
  104. package/dist/gateway/essentials.js.map +0 -1
  105. package/dist/gateway/test-support.d.ts +0 -41
  106. package/dist/gateway/test-support.d.ts.map +0 -1
  107. package/dist/gateway/test-support.js +0 -60
  108. package/dist/gateway/test-support.js.map +0 -1
  109. package/dist/index.d.ts +0 -29
  110. package/dist/index.d.ts.map +0 -1
  111. package/dist/index.js +0 -113
  112. package/dist/index.js.map +0 -1
  113. package/dist/install-skill.d.ts +0 -43
  114. package/dist/install-skill.d.ts.map +0 -1
  115. package/dist/install-skill.js +0 -118
  116. package/dist/install-skill.js.map +0 -1
  117. package/dist/platform/detect.d.ts +0 -64
  118. package/dist/platform/detect.d.ts.map +0 -1
  119. package/dist/platform/detect.js +0 -98
  120. package/dist/platform/detect.js.map +0 -1
  121. package/dist/platform/index.d.ts +0 -121
  122. package/dist/platform/index.d.ts.map +0 -1
  123. package/dist/platform/index.js +0 -176
  124. package/dist/platform/index.js.map +0 -1
  125. package/dist/platform/joomla.d.ts +0 -44
  126. package/dist/platform/joomla.d.ts.map +0 -1
  127. package/dist/platform/joomla.js +0 -46
  128. package/dist/platform/joomla.js.map +0 -1
  129. package/dist/server.d.ts +0 -109
  130. package/dist/server.d.ts.map +0 -1
  131. package/dist/server.js +0 -237
  132. package/dist/server.js.map +0 -1
  133. package/dist/setup-cli-confirm.d.ts +0 -36
  134. package/dist/setup-cli-confirm.d.ts.map +0 -1
  135. package/dist/setup-cli-confirm.js +0 -59
  136. package/dist/setup-cli-confirm.js.map +0 -1
  137. package/dist/setup-cli.d.ts +0 -152
  138. package/dist/setup-cli.d.ts.map +0 -1
  139. package/dist/setup-cli.js +0 -870
  140. package/dist/setup-cli.js.map +0 -1
  141. package/dist/setup-prompts.d.ts +0 -41
  142. package/dist/setup-prompts.d.ts.map +0 -1
  143. package/dist/setup-prompts.js +0 -146
  144. package/dist/setup-prompts.js.map +0 -1
  145. package/dist/setup-token.d.ts +0 -38
  146. package/dist/setup-token.d.ts.map +0 -1
  147. package/dist/setup-token.js +0 -106
  148. package/dist/setup-token.js.map +0 -1
  149. package/dist/setup-wizard-defaults.d.ts +0 -43
  150. package/dist/setup-wizard-defaults.d.ts.map +0 -1
  151. package/dist/setup-wizard-defaults.js +0 -160
  152. package/dist/setup-wizard-defaults.js.map +0 -1
  153. package/dist/setup-wizard-handshake.d.ts +0 -25
  154. package/dist/setup-wizard-handshake.d.ts.map +0 -1
  155. package/dist/setup-wizard-handshake.js +0 -103
  156. package/dist/setup-wizard-handshake.js.map +0 -1
  157. package/dist/setup-wizard-types.d.ts +0 -164
  158. package/dist/setup-wizard-types.d.ts.map +0 -1
  159. package/dist/setup-wizard-types.js +0 -11
  160. package/dist/setup-wizard-types.js.map +0 -1
  161. package/dist/setup-wizard.d.ts +0 -33
  162. package/dist/setup-wizard.d.ts.map +0 -1
  163. package/dist/setup-wizard.js +0 -199
  164. package/dist/setup-wizard.js.map +0 -1
  165. package/dist/setup.d.ts +0 -17
  166. package/dist/setup.d.ts.map +0 -1
  167. package/dist/setup.js +0 -33
  168. package/dist/setup.js.map +0 -1
  169. package/dist/sites/cli/add-site.d.ts +0 -106
  170. package/dist/sites/cli/add-site.d.ts.map +0 -1
  171. package/dist/sites/cli/add-site.js +0 -185
  172. package/dist/sites/cli/add-site.js.map +0 -1
  173. package/dist/sites/cli/list-sites.d.ts +0 -40
  174. package/dist/sites/cli/list-sites.d.ts.map +0 -1
  175. package/dist/sites/cli/list-sites.js +0 -117
  176. package/dist/sites/cli/list-sites.js.map +0 -1
  177. package/dist/sites/cli/remove-site.d.ts +0 -60
  178. package/dist/sites/cli/remove-site.d.ts.map +0 -1
  179. package/dist/sites/cli/remove-site.js +0 -120
  180. package/dist/sites/cli/remove-site.js.map +0 -1
  181. package/dist/sites/cli/set-default.d.ts +0 -47
  182. package/dist/sites/cli/set-default.d.ts.map +0 -1
  183. package/dist/sites/cli/set-default.js +0 -69
  184. package/dist/sites/cli/set-default.js.map +0 -1
  185. package/dist/sites/cli/test-site.d.ts +0 -77
  186. package/dist/sites/cli/test-site.d.ts.map +0 -1
  187. package/dist/sites/cli/test-site.js +0 -146
  188. package/dist/sites/cli/test-site.js.map +0 -1
  189. package/dist/sites/client-pool.d.ts +0 -124
  190. package/dist/sites/client-pool.d.ts.map +0 -1
  191. package/dist/sites/client-pool.js +0 -172
  192. package/dist/sites/client-pool.js.map +0 -1
  193. package/dist/sites/env-bridge.d.ts +0 -55
  194. package/dist/sites/env-bridge.d.ts.map +0 -1
  195. package/dist/sites/env-bridge.js +0 -94
  196. package/dist/sites/env-bridge.js.map +0 -1
  197. package/dist/sites/paths.d.ts +0 -21
  198. package/dist/sites/paths.d.ts.map +0 -1
  199. package/dist/sites/paths.js +0 -37
  200. package/dist/sites/paths.js.map +0 -1
  201. package/dist/sites/probe.d.ts +0 -60
  202. package/dist/sites/probe.d.ts.map +0 -1
  203. package/dist/sites/probe.js +0 -112
  204. package/dist/sites/probe.js.map +0 -1
  205. package/dist/sites/registry.d.ts +0 -142
  206. package/dist/sites/registry.d.ts.map +0 -1
  207. package/dist/sites/registry.js +0 -163
  208. package/dist/sites/registry.js.map +0 -1
  209. package/dist/sites/schema.d.ts +0 -90
  210. package/dist/sites/schema.d.ts.map +0 -1
  211. package/dist/sites/schema.js +0 -71
  212. package/dist/sites/schema.js.map +0 -1
  213. package/dist/sites/secret-resolver.d.ts +0 -109
  214. package/dist/sites/secret-resolver.d.ts.map +0 -1
  215. package/dist/sites/secret-resolver.js +0 -189
  216. package/dist/sites/secret-resolver.js.map +0 -1
  217. package/dist/sites/store.d.ts +0 -82
  218. package/dist/sites/store.d.ts.map +0 -1
  219. package/dist/sites/store.js +0 -198
  220. package/dist/sites/store.js.map +0 -1
  221. package/dist/sites/tools/index.d.ts +0 -28
  222. package/dist/sites/tools/index.d.ts.map +0 -1
  223. package/dist/sites/tools/index.js +0 -30
  224. package/dist/sites/tools/index.js.map +0 -1
  225. package/dist/sites/tools/sites-list.d.ts +0 -48
  226. package/dist/sites/tools/sites-list.d.ts.map +0 -1
  227. package/dist/sites/tools/sites-list.js +0 -135
  228. package/dist/sites/tools/sites-list.js.map +0 -1
  229. package/dist/sites/tools/sites-test.d.ts +0 -47
  230. package/dist/sites/tools/sites-test.d.ts.map +0 -1
  231. package/dist/sites/tools/sites-test.js +0 -148
  232. package/dist/sites/tools/sites-test.js.map +0 -1
  233. package/dist/skill-loader.d.ts +0 -111
  234. package/dist/skill-loader.d.ts.map +0 -1
  235. package/dist/skill-loader.js +0 -191
  236. package/dist/skill-loader.js.map +0 -1
  237. package/dist/tools/elements/builders.d.ts +0 -24
  238. package/dist/tools/elements/builders.d.ts.map +0 -1
  239. package/dist/tools/elements/builders.js +0 -199
  240. package/dist/tools/elements/builders.js.map +0 -1
  241. package/dist/tools/elements/handlers-write.d.ts +0 -49
  242. package/dist/tools/elements/handlers-write.d.ts.map +0 -1
  243. package/dist/tools/elements/handlers-write.js +0 -148
  244. package/dist/tools/elements/handlers-write.js.map +0 -1
  245. package/dist/tools/elements/handlers.d.ts +0 -68
  246. package/dist/tools/elements/handlers.d.ts.map +0 -1
  247. package/dist/tools/elements/handlers.js +0 -206
  248. package/dist/tools/elements/handlers.js.map +0 -1
  249. package/dist/tools/elements/index.d.ts +0 -28
  250. package/dist/tools/elements/index.d.ts.map +0 -1
  251. package/dist/tools/elements/index.js +0 -27
  252. package/dist/tools/elements/index.js.map +0 -1
  253. package/dist/tools/elements.d.ts +0 -13
  254. package/dist/tools/elements.d.ts.map +0 -1
  255. package/dist/tools/elements.js +0 -13
  256. package/dist/tools/elements.js.map +0 -1
  257. package/dist/tools/elicitation.d.ts +0 -87
  258. package/dist/tools/elicitation.d.ts.map +0 -1
  259. package/dist/tools/elicitation.js +0 -100
  260. package/dist/tools/elicitation.js.map +0 -1
  261. package/dist/tools/format/elements-format.d.ts +0 -40
  262. package/dist/tools/format/elements-format.d.ts.map +0 -1
  263. package/dist/tools/format/elements-format.js +0 -194
  264. package/dist/tools/format/elements-format.js.map +0 -1
  265. package/dist/tools/format/health-format.d.ts +0 -79
  266. package/dist/tools/format/health-format.d.ts.map +0 -1
  267. package/dist/tools/format/health-format.js +0 -181
  268. package/dist/tools/format/health-format.js.map +0 -1
  269. package/dist/tools/format/inspection-format.d.ts +0 -58
  270. package/dist/tools/format/inspection-format.d.ts.map +0 -1
  271. package/dist/tools/format/inspection-format.js +0 -164
  272. package/dist/tools/format/inspection-format.js.map +0 -1
  273. package/dist/tools/format/pages-format.d.ts +0 -48
  274. package/dist/tools/format/pages-format.d.ts.map +0 -1
  275. package/dist/tools/format/pages-format.js +0 -137
  276. package/dist/tools/format/pages-format.js.map +0 -1
  277. package/dist/tools/format/sources-format.d.ts +0 -25
  278. package/dist/tools/format/sources-format.d.ts.map +0 -1
  279. package/dist/tools/format/sources-format.js +0 -208
  280. package/dist/tools/format/sources-format.js.map +0 -1
  281. package/dist/tools/health.d.ts +0 -22
  282. package/dist/tools/health.d.ts.map +0 -1
  283. package/dist/tools/health.js +0 -220
  284. package/dist/tools/health.js.map +0 -1
  285. package/dist/tools/index.d.ts +0 -30
  286. package/dist/tools/index.d.ts.map +0 -1
  287. package/dist/tools/index.js +0 -39
  288. package/dist/tools/index.js.map +0 -1
  289. package/dist/tools/inspection.d.ts +0 -14
  290. package/dist/tools/inspection.d.ts.map +0 -1
  291. package/dist/tools/inspection.js +0 -170
  292. package/dist/tools/inspection.js.map +0 -1
  293. package/dist/tools/layout-flatten.d.ts +0 -75
  294. package/dist/tools/layout-flatten.d.ts.map +0 -1
  295. package/dist/tools/layout-flatten.js +0 -107
  296. package/dist/tools/layout-flatten.js.map +0 -1
  297. package/dist/tools/multi-items/builders.d.ts +0 -23
  298. package/dist/tools/multi-items/builders.d.ts.map +0 -1
  299. package/dist/tools/multi-items/builders.js +0 -69
  300. package/dist/tools/multi-items/builders.js.map +0 -1
  301. package/dist/tools/multi-items/clean-implode-handler.d.ts +0 -28
  302. package/dist/tools/multi-items/clean-implode-handler.d.ts.map +0 -1
  303. package/dist/tools/multi-items/clean-implode-handler.js +0 -40
  304. package/dist/tools/multi-items/clean-implode-handler.js.map +0 -1
  305. package/dist/tools/multi-items/index.d.ts +0 -18
  306. package/dist/tools/multi-items/index.d.ts.map +0 -1
  307. package/dist/tools/multi-items/index.js +0 -18
  308. package/dist/tools/multi-items/index.js.map +0 -1
  309. package/dist/tools/multi-items/inspect-handler.d.ts +0 -41
  310. package/dist/tools/multi-items/inspect-handler.d.ts.map +0 -1
  311. package/dist/tools/multi-items/inspect-handler.js +0 -50
  312. package/dist/tools/multi-items/inspect-handler.js.map +0 -1
  313. package/dist/tools/multi-items/item-container-map.d.ts +0 -41
  314. package/dist/tools/multi-items/item-container-map.d.ts.map +0 -1
  315. package/dist/tools/multi-items/item-container-map.js +0 -73
  316. package/dist/tools/multi-items/item-container-map.js.map +0 -1
  317. package/dist/tools/pages/builders.d.ts +0 -14
  318. package/dist/tools/pages/builders.d.ts.map +0 -1
  319. package/dist/tools/pages/builders.js +0 -127
  320. package/dist/tools/pages/builders.js.map +0 -1
  321. package/dist/tools/pages/handlers-read.d.ts +0 -33
  322. package/dist/tools/pages/handlers-read.d.ts.map +0 -1
  323. package/dist/tools/pages/handlers-read.js +0 -171
  324. package/dist/tools/pages/handlers-read.js.map +0 -1
  325. package/dist/tools/pages/handlers-write.d.ts +0 -21
  326. package/dist/tools/pages/handlers-write.d.ts.map +0 -1
  327. package/dist/tools/pages/handlers-write.js +0 -52
  328. package/dist/tools/pages/handlers-write.js.map +0 -1
  329. package/dist/tools/pages/index.d.ts +0 -17
  330. package/dist/tools/pages/index.d.ts.map +0 -1
  331. package/dist/tools/pages/index.js +0 -17
  332. package/dist/tools/pages/index.js.map +0 -1
  333. package/dist/tools/pages/schemas.d.ts +0 -30
  334. package/dist/tools/pages/schemas.d.ts.map +0 -1
  335. package/dist/tools/pages/schemas.js +0 -48
  336. package/dist/tools/pages/schemas.js.map +0 -1
  337. package/dist/tools/pages.d.ts +0 -13
  338. package/dist/tools/pages.d.ts.map +0 -1
  339. package/dist/tools/pages.js +0 -13
  340. package/dist/tools/pages.js.map +0 -1
  341. package/dist/tools/pool-resolve-helper.d.ts +0 -83
  342. package/dist/tools/pool-resolve-helper.d.ts.map +0 -1
  343. package/dist/tools/pool-resolve-helper.js +0 -148
  344. package/dist/tools/pool-resolve-helper.js.map +0 -1
  345. package/dist/tools/progress-phases.d.ts +0 -46
  346. package/dist/tools/progress-phases.d.ts.map +0 -1
  347. package/dist/tools/progress-phases.js +0 -48
  348. package/dist/tools/progress-phases.js.map +0 -1
  349. package/dist/tools/shared-schemas.d.ts +0 -25
  350. package/dist/tools/shared-schemas.d.ts.map +0 -1
  351. package/dist/tools/shared-schemas.js +0 -48
  352. package/dist/tools/shared-schemas.js.map +0 -1
  353. package/dist/tools/sources/builders.d.ts +0 -13
  354. package/dist/tools/sources/builders.d.ts.map +0 -1
  355. package/dist/tools/sources/builders.js +0 -115
  356. package/dist/tools/sources/builders.js.map +0 -1
  357. package/dist/tools/sources/handlers-bind.d.ts +0 -28
  358. package/dist/tools/sources/handlers-bind.d.ts.map +0 -1
  359. package/dist/tools/sources/handlers-bind.js +0 -129
  360. package/dist/tools/sources/handlers-bind.js.map +0 -1
  361. package/dist/tools/sources/handlers.d.ts +0 -45
  362. package/dist/tools/sources/handlers.d.ts.map +0 -1
  363. package/dist/tools/sources/handlers.js +0 -91
  364. package/dist/tools/sources/handlers.js.map +0 -1
  365. package/dist/tools/sources/index.d.ts +0 -19
  366. package/dist/tools/sources/index.d.ts.map +0 -1
  367. package/dist/tools/sources/index.js +0 -18
  368. package/dist/tools/sources/index.js.map +0 -1
  369. package/dist/tools/sources.d.ts +0 -14
  370. package/dist/tools/sources.d.ts.map +0 -1
  371. package/dist/tools/sources.js +0 -14
  372. package/dist/tools/sources.js.map +0 -1
  373. package/dist/tools/sparse-fields.d.ts +0 -80
  374. package/dist/tools/sparse-fields.d.ts.map +0 -1
  375. package/dist/tools/sparse-fields.js +0 -144
  376. package/dist/tools/sparse-fields.js.map +0 -1
  377. package/dist/tools/tool-builder/annotations.d.ts +0 -55
  378. package/dist/tools/tool-builder/annotations.d.ts.map +0 -1
  379. package/dist/tools/tool-builder/annotations.js +0 -86
  380. package/dist/tools/tool-builder/annotations.js.map +0 -1
  381. package/dist/tools/tool-builder/define.d.ts +0 -31
  382. package/dist/tools/tool-builder/define.d.ts.map +0 -1
  383. package/dist/tools/tool-builder/define.js +0 -31
  384. package/dist/tools/tool-builder/define.js.map +0 -1
  385. package/dist/tools/tool-builder/index.d.ts +0 -28
  386. package/dist/tools/tool-builder/index.d.ts.map +0 -1
  387. package/dist/tools/tool-builder/index.js +0 -27
  388. package/dist/tools/tool-builder/index.js.map +0 -1
  389. package/dist/tools/tool-builder/results.d.ts +0 -93
  390. package/dist/tools/tool-builder/results.d.ts.map +0 -1
  391. package/dist/tools/tool-builder/results.js +0 -211
  392. package/dist/tools/tool-builder/results.js.map +0 -1
  393. package/dist/tools/tool-builder/types.d.ts +0 -82
  394. package/dist/tools/tool-builder/types.d.ts.map +0 -1
  395. package/dist/tools/tool-builder/types.js +0 -9
  396. package/dist/tools/tool-builder/types.js.map +0 -1
  397. package/dist/tools/tool-builder.d.ts +0 -16
  398. package/dist/tools/tool-builder.d.ts.map +0 -1
  399. package/dist/tools/tool-builder.js +0 -16
  400. package/dist/tools/tool-builder.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: yt-builder-mcp
3
- description: Drive the YOOtheme Pro Page Builder on WordPress or Joomla 5/6 discover pages, inspect layouts, add/move/clone/delete elements, bind dynamic sources, diagnose 401/403 auth failures. Use when the user works with a YOOtheme Pro site via the YT Builder MCP server.
3
+ description: Drive the YOOtheme Pro Page Builder on WordPress or Joomla 5/6. Discover pages, inspect layouts, add/move/clone/delete elements, bind dynamic sources, diagnose 401/403 auth failures. Use when the user works with a YOOtheme Pro site via the YT Builder MCP server.
4
4
  ---
5
5
 
6
- # YT Builder MCP for YOOtheme Pro (unofficial) Skill
6
+ # YT Builder MCP for YOOtheme Pro (unofficial). Skill
7
7
 
8
8
  > Independent third-party project. YOOtheme® is a registered trademark of YOOtheme GmbH
9
9
  > ([yootheme.com](https://yootheme.com)). YT Builder MCP is built by WootsUp (getimo
@@ -12,45 +12,45 @@ description: Drive the YOOtheme Pro Page Builder on WordPress or Joomla 5/6 —
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 exposes 26 typed, scoped, idempotent
16
- tools. 20 of them advertised as first-class entries in `tools/list` (17 essential
17
- L1 forwards + 2 direct L3 entries + 1 gateway), and 7 advanced tools reachable
18
- through the single `yootheme_builder_advanced` gateway. This 3-lane split keeps
19
- `tools/list` well below the ~40-tool Cursor cap while every catalogued tool stays
20
- fully reachable.
15
+ `@wootsup/yt-builder-mcp` server. The server exposes 27 typed, scoped, idempotent
16
+ callable tools. 20 of them advertised as first-class entries in `tools/list`
17
+ (17 essential L1 forwards + 2 direct L3 entries + 1 gateway), and 7 advanced
18
+ tools reachable through the single `yootheme_builder_advanced` gateway. This
19
+ 3-lane split keeps `tools/list` well below the ~40-tool Cursor cap while every
20
+ catalogued tool stays fully reachable.
21
21
 
22
22
  ## How to use this MCP server
23
23
 
24
24
  The user invokes you through Claude Desktop, Cursor, Zed, Continue, Cline,
25
25
  Roo Code, Claude Code, Codex CLI or any other MCP-aware AI client. Setup is
26
- **cross-platform** the same MCP server speaks to the same WordPress *or*
26
+ **cross-platform**. The same MCP server speaks to the same WordPress *or*
27
27
  Joomla 5/6 host plugin:
28
28
 
29
29
  1. The user installs the host plugin for their CMS:
30
- - **WordPress** install the `yt-builder-mcp` plugin (downloadable from the
30
+ - **WordPress**. Install the `yt-builder-mcp` plugin (downloadable from the
31
31
  [GitHub repository](https://github.com/wootsup/yt-builder-mcp)) and generate
32
32
  a Bearer key in **wp-admin → Tools → "YT Builder MCP" → Bearer Keys**.
33
- - **Joomla 5/6** install the `yt-builder-mcp` package (downloadable from the
33
+ - **Joomla 5/6**. Install the `yt-builder-mcp` package (downloadable from the
34
34
  [GitHub repository](https://github.com/wootsup/yt-builder-mcp)) and generate
35
35
  a Bearer key in **Components → YT Builder MCP → Bearer Keys**. The package
36
36
  installs three sub-extensions (system plugin, webservices plugin, component).
37
37
  2. The user runs `npx -y @wootsup/yt-builder-mcp setup` once; the wizard probes
38
38
  the host plugin, validates the key, and writes the MCP server entry into every
39
- selected AI client's config file. (Wizard prompts include a platform hint
40
- `auto` works for most cases; set it to `joomla` explicitly when the site URL
39
+ selected AI client's config file. (Wizard prompts include a platform hint;
40
+ `auto` works for most cases. Set it to `joomla` explicitly when the site URL
41
41
  has no `/joomla` segment.)
42
42
  3. The user restarts their AI client. The server is now visible.
43
43
  4. The user asks for a YOOtheme task (build, audit, change, diagnose).
44
44
 
45
- ### Two picker entries activate both
45
+ ### Two picker entries (activate both)
46
46
 
47
47
  Some clients (notably Claude Desktop with the `.dxt` bundle) expose **two**
48
48
  entries when the user types "YT Builder MCP" into the picker:
49
49
 
50
- - **`YT Builder MCP for YOOtheme Pro (unofficial)`** the MCP **server**.
50
+ - **`YT Builder MCP for YOOtheme Pro (unofficial)`**: the MCP **server**.
51
51
  Provides the 20 first-class tools (17 essential, 2 direct, 1 gateway).
52
52
  The `yootheme_builder_advanced` gateway routes 7 additional tools.
53
- - **`Von YT Builder MCP for YOOtheme Pro`** the bundled **skill** (this
53
+ - **`Von YT Builder MCP for YOOtheme Pro`**: the bundled **skill** (this
54
54
  document). Gives the agent the workflow knowledge needed to drive those
55
55
  tools correctly on first try.
56
56
 
@@ -58,7 +58,7 @@ entries when the user types "YT Builder MCP" into the picker:
58
58
  typed tools but no narrative guidance; the skill alone has no tools to call.
59
59
 
60
60
  When the user asks a YOOtheme-related question, **always start with
61
- `yootheme_builder_health`** it confirms the host plugin is reachable and (when
61
+ `yootheme_builder_health`**. It confirms the host plugin is reachable and (when
62
62
  the Bearer key is valid) returns the **plugin version, YOOtheme version, WordPress
63
63
  or Joomla version, PHP version, and the site_url + home_url of the connected
64
64
  site**. The site URL is how you know *which* site the agent is currently driving;
@@ -71,24 +71,26 @@ If a tool returns `401 Unauthorized` or `403 Forbidden`, jump straight to
71
71
 
72
72
  The server exposes:
73
73
 
74
- - **2 direct top-level tools** always callable, always in `tools/list`:
74
+ - **2 direct top-level tools**, always callable, always in `tools/list`:
75
75
  `yootheme_builder_health` and `yootheme_builder_diagnose`. These are
76
76
  the "the gateway itself might be broken" escape hatch.
77
- - **17 essential forwarded tools** common reads + the most-used writes
77
+ - **17 essential forwarded tools**: common reads + the most-used writes
78
78
  (pages_list, get_etag, element_list / add / update_settings / get / move /
79
79
  clone / delete, page_get_layout, sources_list, element_types_list,
80
80
  element_type_get_schema, template_summary, inspect_multi_items_binding,
81
81
  sites_list, sites_test). Always advertised in `tools/list` so AI clients
82
82
  see them first-class.
83
- - **7 advanced captured tools** everything else (page_save, page_publish,
83
+ - **7 advanced captured tools**: everything else (page_save, page_publish,
84
84
  page_get_schema, element_get_binding, element_bind_source,
85
85
  element_unbind_source, clean_implode_directives). Reachable through one
86
86
  gateway tool: `yootheme_builder_advanced({ tool: "<name>", input: { ... } })`.
87
- - **1 gateway tool** `yootheme_builder_advanced`.
87
+ - **1 gateway tool**: `yootheme_builder_advanced`.
88
88
 
89
- `tools/list` therefore advertises 20 names (17 + 2 + 1) for a total catalogue
90
- of 26. If the AI client reports "tool not found", you are almost certainly
91
- calling an advanced tool by its raw name. Wrap it in
89
+ `tools/list` therefore advertises 20 names (17 + 2 + 1). That's 17 L1
90
+ essentials + 2 L3 direct + 1 gateway. The total callable surface is 27
91
+ (20 advertised + 7 advanced reachable through the gateway). If the AI
92
+ client reports "tool not found", you are almost certainly calling an
93
+ advanced tool by its raw name. Wrap it in
92
94
  `yootheme_builder_advanced({ tool, input })` instead.
93
95
 
94
96
  ## Site and frontend URLs (for deep-linking and verification)
@@ -108,7 +110,7 @@ guess where the agent is pointing:
108
110
  `frontend_url_template` (with placeholders the user fills in).
109
111
 
110
112
  Treat `frontend_url: null` as "host plugin could not resolve a public URL for
111
- this template" surface that honestly rather than fabricating one.
113
+ this template". Surface that honestly rather than fabricating one.
112
114
 
113
115
  ## Scopes (Bearer key permissions)
114
116
 
@@ -125,12 +127,18 @@ ask the user to regenerate the key with a higher scope **before** retrying.
125
127
  Do not loop on auth errors.
126
128
 
127
129
  > **Joomla note.** On the Joomla API surface (`com_api`), the Bearer token's
128
- > scope is the **sole** authority the L2 article-write `core.edit` ACL gate
130
+ > scope is the **sole** authority. The L2 article-write `core.edit` ACL gate
129
131
  > was intentionally removed (see ADR at https://github.com/wootsup/yt-builder-mcp/blob/main/docs/adr/2026-05-24-l2-bearer-as-authority.md).
130
132
  > Joomla ACL still governs the admin component (`com_ytbmcp`). On WordPress,
131
133
  > capabilities like `manage_options` gate the admin settings page only; the
132
134
  > REST API surface is Bearer-gated.
133
135
 
136
+ > **Joomla L2 articles surface.** The Joomla plugin ships `/v1/articles*`
137
+ > REST endpoints for per-article custom layouts, but they are NOT exposed
138
+ > via MCP tools in v1.x. To use that surface, call the REST endpoints
139
+ > directly with the Bearer key. MCP tool coverage for L2 articles is
140
+ > planned for v1.2.0.
141
+
134
142
  ---
135
143
 
136
144
  ## Working with multiple sites
@@ -290,33 +298,33 @@ for a focused diagnosis without touching the others.
290
298
  **Goal:** Add a fresh hero section (heading + sub-heading + CTA button)
291
299
  to an existing page.
292
300
 
293
- **Canonical tool-call sequence (real parameter names snake_case):**
301
+ **Canonical tool-call sequence (real parameter names, snake_case):**
294
302
 
295
- 1. `yootheme_builder_health` confirm host plugin reachable; note plugin
303
+ 1. `yootheme_builder_health`: confirm host plugin reachable. Note plugin
296
304
  version and `site_url` (some element types are version-gated; surface
297
305
  the site URL back to the user).
298
- 2. `yootheme_builder_pages_list({ fields: ["id", "label"] })` find
306
+ 2. `yootheme_builder_pages_list({ fields: ["id", "label"] })`: find
299
307
  the target template. Returns `[{ id, label, ... }]`. If the user
300
308
  named a specific page, match on `label` (exact then fuzzy).
301
- 3. `yootheme_builder_get_etag()` fetch the current top-level
309
+ 3. `yootheme_builder_get_etag()`: fetch the current top-level
302
310
  optimistic-lock ETag. Every write tool requires it via `etag`.
303
- 4. `yootheme_builder_element_add({ template_id: "<id>", parent_path: "", element_type: "section", props: { background: "primary" }, etag: "<etag>" })`
304
- append a new section at the template root (`parent_path: ""`).
311
+ 4. `yootheme_builder_element_add({ template_id: "<id>", parent_path: "", element_type: "section", props: { background: "primary" }, etag: "<etag>" })`:
312
+ append a new section at the template root (`parent_path: ""`).
305
313
  Returns `{ path: "/0/children/N", etag: "<fresh>" }`.
306
- 5. `yootheme_builder_element_add({ template_id, parent_path: "<section-path>", element_type: "row", etag: "<fresh-etag>" })`
307
- add a row inside the section. Use the etag returned by the
308
- previous write etags rotate every mutation.
309
- 6. `yootheme_builder_element_add({ template_id, parent_path: "<row-path>", element_type: "headline", props: { content: "<h1 text>" }, etag })`
310
- add a headline.
311
- 7. `yootheme_builder_element_add({ template_id, parent_path: "<row-path>", element_type: "text", props: { content: "<sub text>" }, etag })`
312
- add a text element.
313
- 8. `yootheme_builder_element_add({ template_id, parent_path: "<row-path>", element_type: "button", props: { content: "<cta>", link: "<url>" }, etag })`
314
- add the CTA button.
315
- 9. `yootheme_builder_advanced({ tool: "yootheme_builder_page_save", input: { template_id, etag } })`
316
- persist the working copy (visible in YOOtheme Customizer preview).
314
+ 5. `yootheme_builder_element_add({ template_id, parent_path: "<section-path>", element_type: "row", etag: "<fresh-etag>" })`:
315
+ add a row inside the section. Use the etag returned by the
316
+ previous write (etags rotate every mutation).
317
+ 6. `yootheme_builder_element_add({ template_id, parent_path: "<row-path>", element_type: "headline", props: { content: "<h1 text>" }, etag })`:
318
+ add a headline.
319
+ 7. `yootheme_builder_element_add({ template_id, parent_path: "<row-path>", element_type: "text", props: { content: "<sub text>" }, etag })`:
320
+ add a text element.
321
+ 8. `yootheme_builder_element_add({ template_id, parent_path: "<row-path>", element_type: "button", props: { content: "<cta>", link: "<url>" }, etag })`:
322
+ add the CTA button.
323
+ 9. `yootheme_builder_advanced({ tool: "yootheme_builder_page_save", input: { template_id, etag } })`:
324
+ persist the working copy (visible in YOOtheme Customizer preview).
317
325
  `page_save` is an advanced tool; call it through the gateway.
318
- 10. `yootheme_builder_advanced({ tool: "yootheme_builder_page_publish", input: { template_id, etag } })`
319
- make the changes live on the front-end. Also an advanced tool.
326
+ 10. `yootheme_builder_advanced({ tool: "yootheme_builder_page_publish", input: { template_id, etag } })`:
327
+ make the changes live on the front-end. Also an advanced tool.
320
328
 
321
329
  **Common pitfalls:**
322
330
 
@@ -332,19 +340,19 @@ to an existing page.
332
340
  row in between. The server returns a structured error with a
333
341
  human-readable hint when you skip the row.
334
342
  - **Saving without publishing.** `page_save` is the equivalent of the
335
- YOOtheme Customizer "Save" button content lives in the staging
343
+ YOOtheme Customizer "Save" button. Content lives in the staging
336
344
  copy. Visitors see nothing until `page_publish`.
337
345
  - **Reusing a stale etag across many writes.** Every write returns a
338
- fresh etag in the response. Pass THAT etag into the next write
339
- don't hold the one from the original `get_etag` call.
346
+ fresh etag in the response. Pass THAT etag into the next write.
347
+ Don't hold the one from the original `get_etag` call.
340
348
  - **Calling page_save / page_publish by name.** Both are advanced
341
- (L2) tools call them through `yootheme_builder_advanced({ tool, input })`,
349
+ (L2) tools. Call them through `yootheme_builder_advanced({ tool, input })`,
342
350
  not directly. The first sign you forgot is "tool not found".
343
351
 
344
352
  **Worked example (tool-call snippet):**
345
353
 
346
354
  ```jsonc
347
- // Step 4 add the section. parent_path: "" means template root.
355
+ // Step 4. Add the section. parent_path: "" means template root.
348
356
  yootheme_builder_element_add({
349
357
  template_id: "home",
350
358
  parent_path: "",
@@ -355,14 +363,14 @@ yootheme_builder_element_add({
355
363
  // Response: { path: "/0/children/3", etag: "def456" }
356
364
  // → next call uses etag "def456"
357
365
 
358
- // Step 9 page_save is L2; call via the gateway.
366
+ // Step 9. page_save is L2; call via the gateway.
359
367
  yootheme_builder_advanced({
360
368
  tool: "yootheme_builder_page_save",
361
369
  input: { template_id: "home", etag: "<latest>" }
362
370
  })
363
371
  ```
364
372
 
365
- **Edge case:** YOOtheme allows nested sections (rare) if the user
373
+ **Edge case:** YOOtheme allows nested sections (rare). If the user
366
374
  asks for a "card grid inside a hero", you still need the
367
375
  `section → row → column → grid` hierarchy, even when the parent
368
376
  section sits inside another section.
@@ -381,27 +389,27 @@ section as the last child of the template root.
381
389
  Source from API Mapper or the built-in YOOtheme Sources system so it
382
390
  renders dynamic items.
383
391
 
384
- **Canonical tool-call sequence (real parameter names snake_case):**
392
+ **Canonical tool-call sequence (real parameter names, snake_case):**
385
393
 
386
- 1. `yootheme_builder_health` confirm host plugin reachable.
394
+ 1. `yootheme_builder_health`: confirm host plugin reachable.
387
395
  2. `yootheme_builder_pages_list({ fields: ["id", "label"] })` and
388
- `yootheme_builder_page_get_layout({ template_id: "<id>", flat: false })`
389
- locate the target Grid. Note its JSON-Pointer `path` (e.g.
396
+ `yootheme_builder_page_get_layout({ template_id: "<id>", flat: false })`:
397
+ locate the target Grid. Note its JSON-Pointer `path` (e.g.
390
398
  `/0/children/2/children/0`).
391
- 3. `yootheme_builder_element_get({ template_id, element_path })` —
392
- fetch the Grid's current props so you can preserve them; binding
399
+ 3. `yootheme_builder_element_get({ template_id, element_path })`:
400
+ fetch the Grid's current props so you can preserve them. Binding
393
401
  sets `props.source` and leaves the rest alone.
394
- 4. `yootheme_builder_sources_list()` enumerate available Sources.
402
+ 4. `yootheme_builder_sources_list()`: enumerate available Sources.
395
403
  Each returns `{ name, label, origin, kind }`. Pick the one the
396
404
  user asked for.
397
405
  5. `yootheme_builder_advanced({ tool: "yootheme_builder_element_get_binding", input: { template_id, element_path } })`
398
- check whether the Grid is already bound (idempotency: skip step
406
+ check whether the Grid is already bound (idempotency: skip step
399
407
  7 if `source_name` already matches the user's intent).
400
- `element_get_binding` is an advanced (L2) tool call via the gateway.
401
- 6. `yootheme_builder_get_etag()` fetch the optimistic-lock etag for
408
+ `element_get_binding` is an advanced (L2) tool. Call via the gateway.
409
+ 6. `yootheme_builder_get_etag()`: fetch the optimistic-lock etag for
402
410
  the upcoming mutation.
403
411
  7. `yootheme_builder_advanced({ tool: "yootheme_builder_element_bind_source", input: { template_id, element_path, source_name: "<name>", etag: "<etag>" } })`
404
- apply the binding. Returns `{ path, etag, has_binding: true }`.
412
+ applies the binding. Returns `{ path, etag, has_binding: true }`.
405
413
  Pass `source_id: "<origin>:<name>"` as well **only** when two
406
414
  plugins register a source with the same `source_name` (the server
407
415
  surfaces the ambiguity as an elicitation prompt; if the host
@@ -415,7 +423,7 @@ renders dynamic items.
415
423
  - **Inventing `fieldMap`.** The bind tool's schema is just
416
424
  `template_id`, `element_path`, `source_name`, optional `source_id`,
417
425
  `etag`. Field mapping happens inside YOOtheme at render time based
418
- on the element's own field bindings not via an MCP parameter.
426
+ on the element's own field bindings, not via an MCP parameter.
419
427
  - **Wrong parameter names.** Use `template_id` (not `pageId`),
420
428
  `element_path` (not `path`), `source_name` (not `sourceName`),
421
429
  `etag` (not `ifMatch`).
@@ -423,21 +431,22 @@ renders dynamic items.
423
431
  they're PUBLISHED in API Mapper (not just saved). If
424
432
  `yootheme_builder_sources_list` returns no match for the name the
425
433
  user typed, send the user to API Mapper to publish it.
426
- - **Binding non-list elements.** Only multi-item element types (Grid,
427
- List, Switcher, Slider, Slideshow, Carousel, Map) accept a source
428
- binding. Binding a single-item element like Headline returns a
429
- structured `validation` error.
434
+ - **Binding non-list elements.** Only multi-item element types
435
+ (Accordion, Button, Description List, Gallery, Grid, List, Map, Nav,
436
+ Overlay-Slider, Panel-Slider, Popover, Slideshow, Social, Subnav,
437
+ Switcher, Table) accept a source binding. Binding a single-item
438
+ element like Headline returns a structured `validation` error.
430
439
  - **Forgetting `etag`.** Every write requires the optimistic-lock
431
440
  etag. On `412 Precondition Failed` re-fetch via
432
441
  `yootheme_builder_get_etag` and retry.
433
442
  - **Calling bind/unbind directly.** Both `element_bind_source` and
434
- `element_get_binding` are L2 advanced wrap in
443
+ `element_get_binding` are L2 advanced. Wrap in
435
444
  `yootheme_builder_advanced({ tool, input })`.
436
445
 
437
446
  **Worked example (tool-call snippet):**
438
447
 
439
448
  ```jsonc
440
- // Step 7 bind a Posts source onto a Grid element via the gateway.
449
+ // Step 7. Bind a Posts source onto a Grid element via the gateway.
441
450
  yootheme_builder_advanced({
442
451
  tool: "yootheme_builder_element_bind_source",
443
452
  input: {
@@ -460,7 +469,7 @@ yootheme_builder_advanced({
460
469
  **Edge case:** A Source can render zero items at runtime (e.g. empty
461
470
  search filter). The bind call still succeeds; the front-end Grid just
462
471
  shows the YOOtheme "no items" placeholder. Don't treat empty render
463
- as a binding failure verify by re-reading
472
+ as a binding failure. Verify by re-reading
464
473
  `yootheme_builder_element_get_binding` through the gateway.
465
474
 
466
475
  **Success criterion:** After publish, the Grid on the front-end shows
@@ -475,11 +484,11 @@ field-value spot-check). `yootheme_builder_element_get_binding`
475
484
  **Goal:** Duplicate a section inside the SAME template and tweak the
476
485
  copy. Common variants: A/B-style hero, repeated CTA blocks, mirroring
477
486
  a row layout. (Cross-template duplication is **not** supported by
478
- `element_clone` see "Important scope note" below.)
487
+ `element_clone`. See "Important scope note" below.)
479
488
 
480
489
  **Important scope note:** `yootheme_builder_element_clone` is
481
490
  **sibling-only and intra-template**. Its real schema is
482
- `{ template_id, element_path, etag }` there is **no** `destPageId`
491
+ `{ template_id, element_path, etag }`. There is **no** `destPageId`
483
492
  or `destParentPath`. The cloned element lands at the same parent,
484
493
  right after the source. To move the clone elsewhere in the SAME
485
494
  template, call `yootheme_builder_element_move` afterwards. To
@@ -487,23 +496,23 @@ duplicate into a DIFFERENT template, flag to the user that
487
496
  cross-template clone is not currently supported and suggest a
488
497
  CMS-level template duplication (in wp-admin or Joomla administrator).
489
498
 
490
- **Canonical tool-call sequence (real parameter names snake_case):**
499
+ **Canonical tool-call sequence (real parameter names, snake_case):**
491
500
 
492
- 1. `yootheme_builder_health` confirm host plugin reachable.
493
- 2. `yootheme_builder_pages_list({ fields: ["id", "label"] })` —
501
+ 1. `yootheme_builder_health`: confirm host plugin reachable.
502
+ 2. `yootheme_builder_pages_list({ fields: ["id", "label"] })`:
494
503
  locate the template by `label`. Note its `id`.
495
504
  3. `yootheme_builder_advanced({ tool: "yootheme_builder_page_get_schema", input: { template_id } })`
496
- flat schema view (lighter than `page_get_layout`) showing every
505
+ returns a flat schema view (lighter than `page_get_layout`) showing every
497
506
  element path + type. Pick the JSON-Pointer path of the section
498
507
  to clone. `page_get_schema` is L2; call via the gateway.
499
- 4. `yootheme_builder_get_etag()` fetch the optimistic-lock etag.
508
+ 4. `yootheme_builder_get_etag()`: fetch the optimistic-lock etag.
500
509
  5. `yootheme_builder_element_clone({ template_id, element_path: "<src-path>", etag: "<etag>" })`
501
- clone as sibling. Returns `{ path: "<new-path>", etag: "<fresh>" }`.
510
+ clones as sibling. Returns `{ path: "<new-path>", etag: "<fresh>" }`.
502
511
  The new path is at the same parent, immediately after the source.
503
512
  6. (Optional) `yootheme_builder_element_move({ template_id, element_path: "<new-path>", to_parent_path: "<other-parent>", to_index: 0, etag: "<fresh>" })`
504
- re-parent the clone within the same template if needed.
513
+ re-parents the clone within the same template if needed.
505
514
  7. `yootheme_builder_element_update_settings({ template_id, element_path: "<final-path>", props: { ... }, etag: "<fresh>" })`
506
- replace the `props` on the clone. **Existing props NOT in the
515
+ replaces the `props` on the clone. **Existing props NOT in the
507
516
  request are removed** (update_settings is a full replace by default;
508
517
  pass `merge: true` to apply a server-side deep-merge instead).
509
518
  Read the current props first via `yootheme_builder_element_get`
@@ -522,7 +531,7 @@ CMS-level template duplication (in wp-admin or Joomla administrator).
522
531
  first if you only want to tweak a subset and prefer not to use merge.
523
532
  - **Clone-then-update path drift.** The clone returns a path that's
524
533
  correct at the moment of the call. If you fire off many ops in
525
- parallel, a concurrent edit may shift indices refresh via
534
+ parallel, a concurrent edit may shift indices. Refresh via
526
535
  `get_etag` + `page_get_schema` (via gateway) between independent batches.
527
536
  - **Cloning a bound element keeps the binding.** `element_clone`
528
537
  copies the entire element including `props.source`. If the user
@@ -535,7 +544,7 @@ CMS-level template duplication (in wp-admin or Joomla administrator).
535
544
  **Worked example (tool-call snippet):**
536
545
 
537
546
  ```jsonc
538
- // Step 5 clone the section element as a sibling.
547
+ // Step 5. Clone the section element as a sibling.
539
548
  yootheme_builder_element_clone({
540
549
  template_id: "home",
541
550
  element_path: "/0/children/2", // the hero section to duplicate
@@ -543,7 +552,7 @@ yootheme_builder_element_clone({
543
552
  })
544
553
  // Response: { path: "/0/children/3", etag: "def456" }
545
554
 
546
- // Step 7 tweak the clone (replace props entirely, or pass merge: true).
555
+ // Step 7. Tweak the clone (replace props entirely, or pass merge: true).
547
556
  const current = yootheme_builder_element_get({
548
557
  template_id: "home",
549
558
  element_path: "/0/children/3",
@@ -572,16 +581,16 @@ shows the new section at the cloned path with the user's tweaks reflected in
572
581
  ## Workflow 4: Diagnose a 401 / 403 / auth failure
573
582
 
574
583
  **Goal:** Recover from `401 Unauthorized` or `403 Forbidden` without
575
- guessing and without rotating the user's key unnecessarily.
584
+ guessing, and without rotating the user's key unnecessarily.
576
585
 
577
586
  **Canonical tool-call sequence:**
578
587
 
579
- 1. `yootheme_builder_diagnose` single probe that hits `/health` (no
588
+ 1. `yootheme_builder_diagnose` is a single probe that hits `/health` (no
580
589
  auth) and then `/etag` (Bearer auth). Returns
581
590
  `{ plugin_reachable, plugin_version, yootheme_loaded, yootheme_version,
582
591
  endpoint_count, bearer_valid, bearer_error?, site_url?, home_url?,
583
592
  summary? }`. Call this **before** any other tool when you see
584
- auth errors. (Takes no arguments the schema is `{}`.)
593
+ auth errors. (Takes no arguments. The schema is `{}`.)
585
594
  2. **Interpret the result:**
586
595
  - `plugin_reachable: false` → the WordPress / Joomla install is down
587
596
  OR the host plugin is deactivated. Send the user to **wp-admin →
@@ -606,7 +615,7 @@ guessing — and without rotating the user's key unnecessarily.
606
615
  - WordPress: "wp-admin → Tools → YT Builder MCP → Bearer Keys."
607
616
  Joomla: "Components → YT Builder MCP → Bearer Keys."
608
617
  - "Click 'Generate New Key', pick the scope (admin for full access)."
609
- - "Copy the key — it's shown ONCE; you cannot recover it later."
618
+ - "Copy the key. It's shown ONCE; you cannot recover it later."
610
619
  - "Update your AI client config: replace `YTB_MCP_BEARER_TOKEN`
611
620
  with the new key. The fastest way is to re-run
612
621
  `npx -y @wootsup/yt-builder-mcp setup`."
@@ -618,7 +627,7 @@ guessing — and without rotating the user's key unnecessarily.
618
627
  **Common pitfalls:**
619
628
 
620
629
  - **Treating 401 as a network error.** A network error has no HTTP
621
- status — it's a TCP/TLS / DNS failure. 401 means the server
630
+ status. It's a TCP/TLS / DNS failure. 401 means the server
622
631
  responded "I do not accept this key", which is fundamentally a
623
632
  config problem.
624
633
  - **Stripping the `Bearer ` prefix.** The MCP server adds it
@@ -631,12 +640,12 @@ guessing — and without rotating the user's key unnecessarily.
631
640
  - **Confusing 401 with 403.** 401 = "I don't recognise this key"
632
641
  (rotate). 403 = "I recognise the key but it lacks the required
633
642
  scope" (regenerate with higher scope). Different error codes,
634
- different recovery never collapse them into one branch.
643
+ different recovery. Never collapse them into one branch.
635
644
 
636
645
  **Worked example (tool-call snippet):**
637
646
 
638
647
  ```jsonc
639
- // First never retry blindly. Call diagnose (no args).
648
+ // First. Never retry blindly. Call diagnose (no args).
640
649
  yootheme_builder_diagnose({})
641
650
  // Response shape:
642
651
  // {
@@ -654,7 +663,7 @@ yootheme_builder_diagnose({})
654
663
  ```
655
664
 
656
665
  **Edge case:** `plugin_reachable: true` but `yootheme_loaded: false`
657
- the user installed the MCP host plugin but YOOtheme Pro itself
666
+ means the user installed the MCP host plugin but YOOtheme Pro itself
658
667
  isn't active. The MCP server still answers, but every tool that
659
668
  touches the YOOtheme layout returns an empty/error response. Surface
660
669
  the mismatch ("YOOtheme Pro is not active on this install") instead
@@ -674,28 +683,28 @@ YOOtheme install (built-ins + YOOtheme Pro + YOOessentials + child
674
683
  theme + plugin-contributed elements), pick the right one, and place
675
684
  an instance with a sensible default props payload.
676
685
 
677
- **Canonical tool-call sequence (real parameter names snake_case):**
686
+ **Canonical tool-call sequence (real parameter names, snake_case):**
678
687
 
679
- 1. `yootheme_builder_health` note the YOOtheme version; custom
688
+ 1. `yootheme_builder_health`: note the YOOtheme version. Custom
680
689
  elements often require a minimum YOOtheme major.
681
690
  2. `yootheme_builder_element_types_list({ fields: ["name", "label", "origin"] })`
682
- narrow the catalogue with sparse-fields. Returns rows like
691
+ narrows the catalogue with sparse-fields. Returns rows like
683
692
  `{ name: "headline", label: "Headline", origin: "core", ... }`.
684
693
  3. `yootheme_builder_element_type_get_schema({ type_name: "<picked>" })`
685
- fetch the prop schema for the chosen type. Returns the field
694
+ fetches the prop schema for the chosen type. Returns the field
686
695
  definitions you can pass via `props`. Note: the parameter is
687
696
  `type_name`, not `name`.
688
697
  4. `yootheme_builder_pages_list({ fields: ["id", "label"] })` and
689
698
  `yootheme_builder_page_get_layout({ template_id, flat: false })`
690
- locate the `parent_path` (JSON-Pointer) where the new element
699
+ locate the `parent_path` (JSON-Pointer) where the new element
691
700
  should land.
692
- 5. `yootheme_builder_get_etag()` fetch the optimistic-lock etag.
701
+ 5. `yootheme_builder_get_etag()`: fetch the optimistic-lock etag.
693
702
  6. `yootheme_builder_element_add({ template_id, parent_path: "<path>", element_type: "<picked-name>", props: { ... }, etag })`
694
- the server validates `props` against the type schema and
703
+ asks the server to validate `props` against the type schema and
695
704
  returns a structured `validation` error with a per-field issue
696
705
  list if anything is missing or malformed.
697
706
  7. (Optional) `yootheme_builder_element_update_settings({ template_id, element_path: "<new-path>", props: { ... }, etag })`
698
- iterate on the props. **Note: this REPLACES `props` entirely by
707
+ iterates on the props. **Note: this REPLACES `props` entirely by
699
708
  default; pass `merge: true` for a server-side deep-merge.** When
700
709
  replacing, include every key you want to keep.
701
710
  8. `yootheme_builder_advanced({ tool: "yootheme_builder_page_save", input: { template_id, etag } })`
@@ -719,7 +728,7 @@ an instance with a sensible default props payload.
719
728
  element may not register a prop schema. In that case
720
729
  `yootheme_builder_element_type_get_schema` returns an empty/sparse
721
730
  schema and the server accepts arbitrary `props`. Don't assume "no
722
- schema = no required fields" read the third-party element's
731
+ schema = no required fields". Read the third-party element's
723
732
  docs.
724
733
  - **Type name vs. label confusion.** The `name` field on the
725
734
  catalogue row is the machine identifier (e.g. `pro_slider`); the
@@ -732,17 +741,17 @@ an instance with a sensible default props payload.
732
741
  **Worked example (tool-call snippet):**
733
742
 
734
743
  ```jsonc
735
- // Step 2 narrow the catalogue with sparse-fields to save tokens.
744
+ // Step 2. Narrow the catalogue with sparse-fields to save tokens.
736
745
  yootheme_builder_element_types_list({
737
746
  fields: ["name", "label", "origin"]
738
747
  })
739
748
  // Rows: [{ name: "headline", label: "Headline", origin: "core" }, ...]
740
749
 
741
- // Step 3 fetch the schema (note: type_name, not name).
750
+ // Step 3. Fetch the schema (note: type_name, not name).
742
751
  yootheme_builder_element_type_get_schema({ type_name: "headline" })
743
752
  // Returns the field definitions for the headline's `props`.
744
753
 
745
- // Step 6 place the element.
754
+ // Step 6. Place the element.
746
755
  yootheme_builder_element_add({
747
756
  template_id: "home",
748
757
  parent_path: "/0/children/2", // row inside section
@@ -756,7 +765,7 @@ yootheme_builder_element_add({
756
765
  **Edge case:** A child theme can override a built-in element's
757
766
  schema in PHP. The `origin` field will read `child_theme` instead
758
767
  of `core`. If you see surprising required keys, that's the override
759
- talking surface this to the user so they know their theme is
768
+ talking. Surface this to the user so they know their theme is
760
769
  customising element defaults.
761
770
 
762
771
  **Success criterion:** After publish, the front-end shows the new
@@ -774,7 +783,7 @@ and the props payload you passed.
774
783
  re-creating.
775
784
  - **Delete an element**: use `yootheme_builder_element_delete({
776
785
  template_id, element_path, etag, confirm: true })`.
777
- Elicitation-aware confirms via the AI client prompt before
786
+ Elicitation-aware. Confirms via the AI client prompt before
778
787
  destroying state when `confirm` is omitted. On hosts without
779
788
  elicitation, it returns a preview-with-confirm-required response;
780
789
  call again with `confirm: true`.
@@ -785,7 +794,7 @@ and the props payload you passed.
785
794
  type without fetching the whole nested tree): call through the
786
795
  gateway: `yootheme_builder_advanced({ tool: "yootheme_builder_page_get_schema", input: { template_id } })`.
787
796
  - **Etag-only fetch** (e.g. polling for concurrent edits): use
788
- `yootheme_builder_get_etag()` (takes no arguments) cheaper than
797
+ `yootheme_builder_get_etag()` (takes no arguments) is cheaper than
789
798
  fetching the full layout.
790
799
  - **Find a public/front-end URL for a template** (404 test page,
791
800
  homepage URL, etc.): call
@@ -812,7 +821,7 @@ Joomla administrator access." Don't fabricate tool calls.
812
821
 
813
822
  <!-- TOOL-CATALOG:BEGIN -->
814
823
 
815
- **26 tools** 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.
824
+ **26 catalogued tools** plus the `yootheme_builder_advanced` gateway = **27 reachable via `tools/list`** (17 L1 + 2 L3 + 1 gateway = 20 advertised; the gateway routes to 7 additional advanced tools, bringing the total to 27 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.
816
825
 
817
826
  | Tool | Kind | Input keys | Description |
818
827
  | --- | --- | --- | --- |
@@ -823,24 +832,24 @@ Joomla administrator access." Don't fabricate tool calls.
823
832
  | `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. |
824
833
  | `yootheme_builder_element_delete` | destructive | `confirm`, `element_path`, `etag`, `site_id`, `template_id` | PERMANENTLY delete an element and all its children. Cannot be undone. 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. |
825
834
  | `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. |
826
- | `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. |
835
+ | `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. |
827
836
  | `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. |
828
837
  | `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. |
829
- | `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. |
838
+ | `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. |
830
839
  | `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. Operates on the default site unless site_id is provided. |
831
- | `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. |
832
- | `yootheme_builder_element_update_settings` | idempotent | `element_path`, `etag`, `merge`, `props`, `site_id`, `template_id` | Update `props` on an element. Default replaces all props; pass `merge:true` for server-side deep-merge (only request keys overwritten, others survive avoids read-modify-write races). Requires ETag. Operates on the default site unless site_id is provided. |
833
- | `yootheme_builder_get_etag` | read+idempotent | `site_id` | Get the current top-level state ETag. Pass it back via `etag` on any write tool (page_save/page_publish/element_set/binding_set) to enforce optimistic-locking the server returns 412 when the ETag has changed since you read it. Operates on the default site unless site_id is provided. |
840
+ | `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, so always ask the user to confirm. Requires ETag. Operates on the default site unless site_id is provided. |
841
+ | `yootheme_builder_element_update_settings` | idempotent | `element_path`, `etag`, `merge`, `props`, `site_id`, `template_id` | Update `props` on an element. Default replaces all props; pass `merge:true` for server-side deep-merge (only request keys overwritten, others survive, which avoids read-modify-write races). Requires ETag. Operates on the default site unless site_id is provided. |
842
+ | `yootheme_builder_get_etag` | read+idempotent | `site_id` | Get the current ETag (state revision) for the YOOtheme builder. Returns sha256+revision string used for optimistic locking on writes. Pass the returned value back as `etag` on any write tool (page_save, page_publish, element_add, element_update_settings, element_clone, element_move, element_delete). The server returns HTTP 412 if the ETag has changed since you read it. Keywords: get etag, current etag, state revision, optimistic lock, version stamp. Operates on the default site unless site_id is provided. |
834
843
  | `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. |
835
844
  | `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, …), current binding level (none\|container\|item), and a recommended_fix when the binding sits on the container instead of the child. Operates on the default site unless site_id is provided. |
836
845
  | `yootheme_builder_page_get_layout` | read+idempotent | `fields`, `flat`, `site_id`, `template_id` | Get full layout tree for one template. Default nested `{layout, etag}`. Set `flat:true` for depth-first array `{elements:[...], etag}`; combine with `fields[]` to project per-element. Operates on the default site unless site_id is provided. |
837
- | `yootheme_builder_page_get_schema` | read+idempotent | `site_id`, `template_id` | Get the flat schema for a template a list of nodes with their JSON-Pointer paths and element types. Best entry-point for navigation: lighter than page_get_layout, sufficient to locate elements before editing. Operates on the default site unless site_id is provided. |
838
- | `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. |
839
- | `yootheme_builder_page_save` | idempotent | `etag`, `site_id`, `template_id` | Re-run save-transforms and persist. ETag optional when provided, 412 on conflict; when omitted, last-write-wins. Recommended for collaborative edits. No-op when state is byte-identical (returns `no_changes:true`, ETag unchanged). Operates on the default site unless site_id is provided. |
840
- | `yootheme_builder_pages_list` | read+idempotent | `fields`, `site_id` | List YT templates. Returns id, label, usage meta + per-row `frontend_url` (permalink when public) and `frontend_url_template` (pattern for search / 404 / ID-based templates). Pass `fields:["id","label"]` to slim. Site URL: diagnose. Operates on the default site unless site_id is provided. |
841
- | `yootheme_builder_sites_list` | read+idempotent | `site_id` | List every site configured in this MCP server (site_id, URL, platform, default flag, bearer source). Platform-agnostic. Never calls a REST endpoint, never resolves a bearer. Useful when the agent needs to discover available site_ids before targeting one with `site_id: "<id>"`. (`site_id` is accepted for schema-uniformity but ignored by this tool.) |
842
- | `yootheme_builder_sites_test` | read+idempotent | `site_id` | Verify connectivity to ONE configured site: probes `/health` (unauthenticated) and `/etag` (authenticated) in parallel and returns plugin_reachable + bearer_valid in a single call. `site_id` is REQUIRED (this tool exists to test a specific id, never the default). Use `yootheme_builder_sites_list` to discover available IDs first. |
843
- | `yootheme_builder_sources_list` | read+idempotent | `fields`, `site_id` | List Builder sources grouped by origin (apimapper/wordpress/essentials). Returns name+label per source pick one for `element_bind_source`. Pass `fields[]` to narrow each row. Operates on the default site unless site_id is provided. |
844
- | `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. Operates on the default site unless site_id is provided. |
846
+ | `yootheme_builder_page_get_schema` | read+idempotent | `site_id`, `template_id` | Get the flat schema for a template: a list of nodes with their JSON-Pointer paths and element types. Best entry-point for navigation: lighter than page_get_layout, sufficient to locate elements before editing. Operates on the default site unless site_id is provided. |
847
+ | `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. |
848
+ | `yootheme_builder_page_save` | idempotent | `etag`, `site_id`, `template_id` | Re-run save-transforms and persist. ETag optional. When provided, 412 on conflict; when omitted, last-write-wins. Recommended for collaborative edits. No-op when state is byte-identical (returns `no_changes:true`, ETag unchanged). Operates on the default site unless site_id is provided. |
849
+ | `yootheme_builder_pages_list` | read+idempotent | `fields`, `site_id` | List all pages, templates, and layouts in the YOOtheme Pro builder. Returns template_id, label, type, element count, and frontend_url per row. CALL THIS FIRST to discover available template IDs before any tool that needs a template_id (page_get_layout, element_list, page_get_schema, etc.). Keywords: list pages, list templates, list layouts, discover template_id, index, available templates, what pages exist. Pass `fields:["id","label"]` to slim. Returns ALL pages in one call (no pagination, typically <50 templates per site). Operates on the default site unless site_id is provided. |
850
+ | `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.) |
851
+ | `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. |
852
+ | `yootheme_builder_sources_list` | read+idempotent | `fields`, `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. Pick a source name from the list and pass it to `element_bind_source`. Keywords: list sources, list data sources, list feeds, list bindings, dynamic content, available data, what sources exist. Pass `fields[]` to narrow each row. Operates on the default site unless site_id is provided. |
853
+ | `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. Operates on the default site unless site_id is provided. |
845
854
 
846
855
  <!-- TOOL-CATALOG:END -->