@maz-ui/mcp 5.0.0-beta.17 → 5.0.0-beta.18

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 (88) hide show
  1. package/dist/mcp.d.mts +22 -9
  2. package/dist/mcp.d.ts +22 -9
  3. package/dist/mcp.mjs +160 -83
  4. package/docs/src/blog/v4.md +1 -1
  5. package/docs/src/blog/v5.md +4 -4
  6. package/docs/src/components/maz-btn.md +1 -1
  7. package/docs/src/components/maz-date-picker.md +1 -1
  8. package/docs/src/components/maz-icon.md +2 -2
  9. package/docs/src/directives/click-outside.md +1 -1
  10. package/docs/src/directives/fullscreen-img.md +1 -1
  11. package/docs/src/directives/lazy-img.md +1 -1
  12. package/docs/src/directives/tooltip.md +1 -1
  13. package/docs/src/directives/zoom-img.md +1 -1
  14. package/docs/src/{guide/icons.md → ecosystem/icons/index.md} +1 -1
  15. package/docs/src/ecosystem/node/exec-promise.md +87 -0
  16. package/docs/src/ecosystem/node/index.md +53 -0
  17. package/docs/src/ecosystem/node/logger.md +146 -0
  18. package/docs/src/ecosystem/node/print-banner.md +93 -0
  19. package/docs/src/{guide → ecosystem}/nuxt.md +1 -1
  20. package/docs/src/{guide → ecosystem}/themes.md +4 -4
  21. package/docs/src/{guide → ecosystem}/translations.md +1 -1
  22. package/docs/src/ecosystem/utils/camel-case.md +31 -0
  23. package/docs/src/ecosystem/utils/check-availability.md +79 -0
  24. package/docs/src/ecosystem/utils/cookie.md +80 -0
  25. package/docs/src/ecosystem/utils/debounce-callback.md +38 -0
  26. package/docs/src/ecosystem/utils/debounce-id.md +69 -0
  27. package/docs/src/ecosystem/utils/debounce.md +65 -0
  28. package/docs/src/ecosystem/utils/fetch-locale-ip.md +33 -0
  29. package/docs/src/ecosystem/utils/format-json.md +33 -0
  30. package/docs/src/ecosystem/utils/format-phone-number.md +37 -0
  31. package/docs/src/ecosystem/utils/get-browser-locale.md +29 -0
  32. package/docs/src/ecosystem/utils/get-error-message.md +39 -0
  33. package/docs/src/ecosystem/utils/idle-timeout.md +90 -0
  34. package/docs/src/ecosystem/utils/index.md +60 -0
  35. package/docs/src/ecosystem/utils/is-client.md +32 -0
  36. package/docs/src/ecosystem/utils/is-equal.md +38 -0
  37. package/docs/src/ecosystem/utils/is-server.md +31 -0
  38. package/docs/src/ecosystem/utils/is-standalone-mode.md +43 -0
  39. package/docs/src/ecosystem/utils/kebab-case.md +36 -0
  40. package/docs/src/ecosystem/utils/normalize-string.md +77 -0
  41. package/docs/src/ecosystem/utils/pascal-case.md +35 -0
  42. package/docs/src/ecosystem/utils/script-loader.md +77 -0
  43. package/docs/src/ecosystem/utils/sleep.md +59 -0
  44. package/docs/src/ecosystem/utils/snake-case.md +36 -0
  45. package/docs/src/ecosystem/utils/swipe-handler.md +91 -0
  46. package/docs/src/ecosystem/utils/textarea-autogrow.md +41 -0
  47. package/docs/src/ecosystem/utils/throttle-id.md +48 -0
  48. package/docs/src/ecosystem/utils/throttle.md +57 -0
  49. package/docs/src/ecosystem/utils/truthy-filter.md +31 -0
  50. package/docs/src/ecosystem/utils/types/deep-key-of.md +48 -0
  51. package/docs/src/ecosystem/utils/types/deep-partial.md +42 -0
  52. package/docs/src/ecosystem/utils/types/deep-required.md +39 -0
  53. package/docs/src/ecosystem/utils/types/flatten-object-keys.md +44 -0
  54. package/docs/src/ecosystem/utils/types/generic-instance-type.md +42 -0
  55. package/docs/src/ecosystem/utils/types/infer-maybe-ref.md +35 -0
  56. package/docs/src/ecosystem/utils/upper-first.md +32 -0
  57. package/docs/src/ecosystem/utils/user-visibility.md +69 -0
  58. package/docs/src/guide/getting-started.md +2 -2
  59. package/docs/src/guide/migration-v4.md +6 -6
  60. package/docs/src/guide/resolvers.md +7 -7
  61. package/docs/src/guide/vue.md +4 -4
  62. package/docs/src/index.md +12 -12
  63. package/docs/src/plugins/aos.md +1 -1
  64. package/package.json +5 -5
  65. package/docs/src/helpers/camel-case.md +0 -14
  66. package/docs/src/helpers/check-availability.md +0 -14
  67. package/docs/src/helpers/debounce-callback.md +0 -14
  68. package/docs/src/helpers/debounce-id.md +0 -14
  69. package/docs/src/helpers/debounce.md +0 -14
  70. package/docs/src/helpers/is-client.md +0 -14
  71. package/docs/src/helpers/is-equal.md +0 -14
  72. package/docs/src/helpers/is-standalone-mode.md +0 -14
  73. package/docs/src/helpers/kebab-case.md +0 -14
  74. package/docs/src/helpers/normalize-string.md +0 -14
  75. package/docs/src/helpers/pascal-case.md +0 -14
  76. package/docs/src/helpers/script-loader.md +0 -14
  77. package/docs/src/helpers/sleep.md +0 -14
  78. package/docs/src/helpers/snake-case.md +0 -14
  79. package/docs/src/helpers/throttle-id.md +0 -14
  80. package/docs/src/helpers/throttle.md +0 -14
  81. /package/docs/src/{guide → ecosystem/icons}/icon-set.md +0 -0
  82. /package/docs/src/{guide → ecosystem}/mcp.md +0 -0
  83. /package/docs/src/{helpers → ecosystem/utils}/capitalize.md +0 -0
  84. /package/docs/src/{helpers → ecosystem/utils}/country-code-to-unicode-flag.md +0 -0
  85. /package/docs/src/{helpers → ecosystem/utils}/currency.md +0 -0
  86. /package/docs/src/{helpers → ecosystem/utils}/date.md +0 -0
  87. /package/docs/src/{helpers → ecosystem/utils}/get-country-flag-url.md +0 -0
  88. /package/docs/src/{helpers → ecosystem/utils}/number.md +0 -0
package/dist/mcp.d.mts CHANGED
@@ -16,7 +16,7 @@ interface DocumentMetadata {
16
16
  sections: SectionMetadata[];
17
17
  }
18
18
 
19
- type DocumentType = 'component' | 'guide' | 'composable' | 'directive' | 'plugin' | 'helper';
19
+ type DocumentType = 'component' | 'guide' | 'composable' | 'directive' | 'plugin' | 'util' | 'node';
20
20
  interface Document {
21
21
  name: string;
22
22
  type: DocumentType;
@@ -46,7 +46,11 @@ interface DocumentationDiagnostics {
46
46
  total: number;
47
47
  list: string[];
48
48
  };
49
- helpers: {
49
+ utils: {
50
+ total: number;
51
+ list: string[];
52
+ };
53
+ node: {
50
54
  total: number;
51
55
  list: string[];
52
56
  };
@@ -58,7 +62,10 @@ interface DocumentationDiagnostics {
58
62
  composablesDir: string;
59
63
  directivesDir: string;
60
64
  pluginsDir: string;
61
- helpersDir: string;
65
+ ecosystemDir: string;
66
+ utilsDir: string;
67
+ nodeDir: string;
68
+ iconsDir: string;
62
69
  };
63
70
  }
64
71
  declare class DocumentationService {
@@ -69,7 +76,11 @@ declare class DocumentationService {
69
76
  private readonly composablesDir;
70
77
  private readonly directivesDir;
71
78
  private readonly pluginsDir;
72
- private readonly helpersDir;
79
+ private readonly ecosystemDir;
80
+ private readonly utilsDir;
81
+ private readonly utilsTypesDir;
82
+ private readonly nodeDir;
83
+ private readonly iconsDir;
73
84
  private readonly metadataExtractor;
74
85
  constructor();
75
86
  private pascalToKebabCase;
@@ -85,8 +96,10 @@ declare class DocumentationService {
85
96
  getAllDirectives(): string[];
86
97
  getPluginDocumentation(pluginName: string): string;
87
98
  getAllPlugins(): string[];
88
- getHelperDocumentation(helperName: string): string;
89
- getAllHelpers(): string[];
99
+ getUtilDocumentation(utilName: string): string;
100
+ getAllUtils(): string[];
101
+ getNodeDocumentation(nodeName: string): string;
102
+ getAllNode(): string[];
90
103
  getAllDocuments(): Document[];
91
104
  private buildDocument;
92
105
  getOverview(): string;
@@ -96,7 +109,7 @@ declare class DocumentationService {
96
109
 
97
110
  /**
98
111
  * MCP server for Maz-UI documentation
99
- * Provides robust access to Vue.js components, guides, composables, directives, plugins, and helper utilities
112
+ * Provides robust access to Vue.js components, guides, composables, directives, plugins, utils and node utilities
100
113
  * with fuzzy search, comprehensive indexing, and intelligent fallbacks
101
114
  */
102
115
  declare class MazUiMcpServer {
@@ -120,9 +133,9 @@ declare class MazUiMcpServer {
120
133
  */
121
134
  private getComponentType;
122
135
  /**
123
- * Determine helper type for better categorization
136
+ * Determine util type for better categorization
124
137
  */
125
- private getHelperType;
138
+ private getUtilType;
126
139
  /**
127
140
  * Resolve a document name using intelligent matching:
128
141
  * PascalCase (MazBtn), kebab-case (maz-btn), short name (btn), aliases
package/dist/mcp.d.ts CHANGED
@@ -16,7 +16,7 @@ interface DocumentMetadata {
16
16
  sections: SectionMetadata[];
17
17
  }
18
18
 
19
- type DocumentType = 'component' | 'guide' | 'composable' | 'directive' | 'plugin' | 'helper';
19
+ type DocumentType = 'component' | 'guide' | 'composable' | 'directive' | 'plugin' | 'util' | 'node';
20
20
  interface Document {
21
21
  name: string;
22
22
  type: DocumentType;
@@ -46,7 +46,11 @@ interface DocumentationDiagnostics {
46
46
  total: number;
47
47
  list: string[];
48
48
  };
49
- helpers: {
49
+ utils: {
50
+ total: number;
51
+ list: string[];
52
+ };
53
+ node: {
50
54
  total: number;
51
55
  list: string[];
52
56
  };
@@ -58,7 +62,10 @@ interface DocumentationDiagnostics {
58
62
  composablesDir: string;
59
63
  directivesDir: string;
60
64
  pluginsDir: string;
61
- helpersDir: string;
65
+ ecosystemDir: string;
66
+ utilsDir: string;
67
+ nodeDir: string;
68
+ iconsDir: string;
62
69
  };
63
70
  }
64
71
  declare class DocumentationService {
@@ -69,7 +76,11 @@ declare class DocumentationService {
69
76
  private readonly composablesDir;
70
77
  private readonly directivesDir;
71
78
  private readonly pluginsDir;
72
- private readonly helpersDir;
79
+ private readonly ecosystemDir;
80
+ private readonly utilsDir;
81
+ private readonly utilsTypesDir;
82
+ private readonly nodeDir;
83
+ private readonly iconsDir;
73
84
  private readonly metadataExtractor;
74
85
  constructor();
75
86
  private pascalToKebabCase;
@@ -85,8 +96,10 @@ declare class DocumentationService {
85
96
  getAllDirectives(): string[];
86
97
  getPluginDocumentation(pluginName: string): string;
87
98
  getAllPlugins(): string[];
88
- getHelperDocumentation(helperName: string): string;
89
- getAllHelpers(): string[];
99
+ getUtilDocumentation(utilName: string): string;
100
+ getAllUtils(): string[];
101
+ getNodeDocumentation(nodeName: string): string;
102
+ getAllNode(): string[];
90
103
  getAllDocuments(): Document[];
91
104
  private buildDocument;
92
105
  getOverview(): string;
@@ -96,7 +109,7 @@ declare class DocumentationService {
96
109
 
97
110
  /**
98
111
  * MCP server for Maz-UI documentation
99
- * Provides robust access to Vue.js components, guides, composables, directives, plugins, and helper utilities
112
+ * Provides robust access to Vue.js components, guides, composables, directives, plugins, utils and node utilities
100
113
  * with fuzzy search, comprehensive indexing, and intelligent fallbacks
101
114
  */
102
115
  declare class MazUiMcpServer {
@@ -120,9 +133,9 @@ declare class MazUiMcpServer {
120
133
  */
121
134
  private getComponentType;
122
135
  /**
123
- * Determine helper type for better categorization
136
+ * Determine util type for better categorization
124
137
  */
125
- private getHelperType;
138
+ private getUtilType;
126
139
  /**
127
140
  * Resolve a document name using intelligent matching:
128
141
  * PascalCase (MazBtn), kebab-case (maz-btn), short name (btn), aliases
package/dist/mcp.mjs CHANGED
@@ -3,11 +3,11 @@ import { getErrorMessage } from '@maz-ui/utils/helpers/getErrorMessage';
3
3
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
4
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
5
  import { ListResourcesRequestSchema, ReadResourceRequestSchema, ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
6
- import { existsSync, readFileSync, readdirSync } from 'node:fs';
6
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
7
7
  import { resolve, join, dirname } from 'node:path';
8
8
  import { fileURLToPath } from 'node:url';
9
9
 
10
- const version = "5.0.0-beta.17";
10
+ const version = "5.0.0-beta.18";
11
11
 
12
12
  class MetadataExtractor {
13
13
  extract(name, type, content, manualTags = []) {
@@ -248,7 +248,11 @@ class DocumentationService {
248
248
  composablesDir;
249
249
  directivesDir;
250
250
  pluginsDir;
251
- helpersDir;
251
+ ecosystemDir;
252
+ utilsDir;
253
+ utilsTypesDir;
254
+ nodeDir;
255
+ iconsDir;
252
256
  metadataExtractor = new MetadataExtractor();
253
257
  constructor() {
254
258
  const localDocsRoot = resolve(_dirname, "../docs/src");
@@ -260,7 +264,11 @@ class DocumentationService {
260
264
  this.composablesDir = join(this.docsRoot, "composables");
261
265
  this.directivesDir = join(this.docsRoot, "directives");
262
266
  this.pluginsDir = join(this.docsRoot, "plugins");
263
- this.helpersDir = join(this.docsRoot, "helpers");
267
+ this.ecosystemDir = join(this.docsRoot, "ecosystem");
268
+ this.utilsDir = join(this.ecosystemDir, "utils");
269
+ this.utilsTypesDir = join(this.utilsDir, "types");
270
+ this.nodeDir = join(this.ecosystemDir, "node");
271
+ this.iconsDir = join(this.ecosystemDir, "icons");
264
272
  }
265
273
  pascalToKebabCase(pascalName) {
266
274
  return pascalName.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "");
@@ -275,13 +283,20 @@ class DocumentationService {
275
283
  return "";
276
284
  }
277
285
  }
278
- listMarkdownFiles(dirPath) {
286
+ listMarkdownFiles(dirPath, options = {}) {
279
287
  try {
280
288
  if (!existsSync(dirPath)) {
281
289
  return [];
282
290
  }
283
- const files = readdirSync(dirPath);
284
- return files.filter((file) => file.endsWith(".md") && file !== "index.md").map((file) => file.replace(".md", "")).sort();
291
+ const entries = readdirSync(dirPath);
292
+ return entries.filter((entry) => {
293
+ if (!entry.endsWith(".md"))
294
+ return false;
295
+ if (!options.keepIndex && entry === "index.md")
296
+ return false;
297
+ const fullPath = join(dirPath, entry);
298
+ return statSync(fullPath).isFile();
299
+ }).map((file) => file.replace(".md", "")).sort();
285
300
  } catch {
286
301
  return [];
287
302
  }
@@ -322,12 +337,38 @@ ${generatedDoc}`;
322
337
  return Array.from(allComponents).sort();
323
338
  }
324
339
  // ========== GUIDES ==========
340
+ // Aggregates: guide/*.md + ecosystem/*.md (standalone) + ecosystem/icons/*.md (index.md → 'icons')
325
341
  getGuideDocumentation(guideName) {
326
- const guidePath = join(this.guidesDir, `${guideName}.md`);
327
- return this.readMarkdownFile(guidePath);
342
+ const candidates = [
343
+ join(this.guidesDir, `${guideName}.md`),
344
+ join(this.ecosystemDir, `${guideName}.md`),
345
+ join(this.iconsDir, `${guideName}.md`)
346
+ ];
347
+ if (guideName === "icons") {
348
+ candidates.push(join(this.iconsDir, "index.md"));
349
+ }
350
+ for (const path of candidates) {
351
+ const content = this.readMarkdownFile(path);
352
+ if (content)
353
+ return content;
354
+ }
355
+ return "";
328
356
  }
329
357
  getAllGuides() {
330
- return this.listMarkdownFiles(this.guidesDir);
358
+ const guides = /* @__PURE__ */ new Set();
359
+ for (const name of this.listMarkdownFiles(this.guidesDir)) {
360
+ guides.add(name);
361
+ }
362
+ for (const name of this.listMarkdownFiles(this.ecosystemDir)) {
363
+ guides.add(name);
364
+ }
365
+ for (const name of this.listMarkdownFiles(this.iconsDir)) {
366
+ guides.add(name);
367
+ }
368
+ if (existsSync(join(this.iconsDir, "index.md"))) {
369
+ guides.add("icons");
370
+ }
371
+ return Array.from(guides).sort();
331
372
  }
332
373
  // ========== COMPOSABLES ==========
333
374
  getComposableDocumentation(composableName) {
@@ -353,13 +394,34 @@ ${generatedDoc}`;
353
394
  getAllPlugins() {
354
395
  return this.listMarkdownFiles(this.pluginsDir);
355
396
  }
356
- // ========== HELPERS ==========
357
- getHelperDocumentation(helperName) {
358
- const helperPath = join(this.helpersDir, `${helperName}.md`);
359
- return this.readMarkdownFile(helperPath);
397
+ // ========== UTILS ==========
398
+ // Aggregates: ecosystem/utils/*.md + ecosystem/utils/types/*.md
399
+ getUtilDocumentation(utilName) {
400
+ const candidates = [
401
+ join(this.utilsDir, `${utilName}.md`),
402
+ join(this.utilsTypesDir, `${utilName}.md`)
403
+ ];
404
+ for (const path of candidates) {
405
+ const content = this.readMarkdownFile(path);
406
+ if (content)
407
+ return content;
408
+ }
409
+ return "";
410
+ }
411
+ getAllUtils() {
412
+ const utils = /* @__PURE__ */ new Set([
413
+ ...this.listMarkdownFiles(this.utilsDir),
414
+ ...this.listMarkdownFiles(this.utilsTypesDir)
415
+ ]);
416
+ return Array.from(utils).sort();
417
+ }
418
+ // ========== NODE ==========
419
+ getNodeDocumentation(nodeName) {
420
+ const nodePath = join(this.nodeDir, `${nodeName}.md`);
421
+ return this.readMarkdownFile(nodePath);
360
422
  }
361
- getAllHelpers() {
362
- return this.listMarkdownFiles(this.helpersDir);
423
+ getAllNode() {
424
+ return this.listMarkdownFiles(this.nodeDir);
363
425
  }
364
426
  // ========== UNIFIED LOADING ==========
365
427
  getAllDocuments() {
@@ -375,7 +437,8 @@ ${generatedDoc}`;
375
437
  { type: "composable", names: this.getAllComposables(), getContent: (name) => this.getComposableDocumentation(name) },
376
438
  { type: "directive", names: this.getAllDirectives(), getContent: (name) => this.getDirectiveDocumentation(name) },
377
439
  { type: "plugin", names: this.getAllPlugins(), getContent: (name) => this.getPluginDocumentation(name) },
378
- { type: "helper", names: this.getAllHelpers(), getContent: (name) => this.getHelperDocumentation(name) }
440
+ { type: "util", names: this.getAllUtils(), getContent: (name) => this.getUtilDocumentation(name) },
441
+ { type: "node", names: this.getAllNode(), getContent: (name) => this.getNodeDocumentation(name) }
379
442
  ];
380
443
  for (const category of categories) {
381
444
  for (const name of category.names) {
@@ -403,52 +466,33 @@ ${generatedDoc}`;
403
466
  searchDocumentation(query) {
404
467
  const searchTerm = query.toLowerCase();
405
468
  const results = [];
406
- const components = this.getAllComponents();
407
- for (const component of components) {
408
- if (component.toLowerCase().includes(searchTerm)) {
409
- results.push(`component:${component}`);
410
- }
411
- }
412
- const guides = this.getAllGuides();
413
- for (const guide of guides) {
414
- if (guide.toLowerCase().includes(searchTerm)) {
415
- results.push(`guide:${guide}`);
416
- }
417
- }
418
- const composables = this.getAllComposables();
419
- for (const composable of composables) {
420
- if (composable.toLowerCase().includes(searchTerm)) {
421
- results.push(`composable:${composable}`);
422
- }
423
- }
424
- const directives = this.getAllDirectives();
425
- for (const directive of directives) {
426
- if (directive.toLowerCase().includes(searchTerm)) {
427
- results.push(`directive:${directive}`);
428
- }
429
- }
430
- const plugins = this.getAllPlugins();
431
- for (const plugin of plugins) {
432
- if (plugin.toLowerCase().includes(searchTerm)) {
433
- results.push(`plugin:${plugin}`);
434
- }
435
- }
436
- const helpers = this.getAllHelpers();
437
- for (const helper of helpers) {
438
- if (helper.toLowerCase().includes(searchTerm)) {
439
- results.push(`helper:${helper}`);
469
+ const buckets = [
470
+ { type: "component", names: this.getAllComponents() },
471
+ { type: "guide", names: this.getAllGuides() },
472
+ { type: "composable", names: this.getAllComposables() },
473
+ { type: "directive", names: this.getAllDirectives() },
474
+ { type: "plugin", names: this.getAllPlugins() },
475
+ { type: "util", names: this.getAllUtils() },
476
+ { type: "node", names: this.getAllNode() }
477
+ ];
478
+ for (const { type, names } of buckets) {
479
+ for (const name of names) {
480
+ if (name.toLowerCase().includes(searchTerm)) {
481
+ results.push(`${type}:${name}`);
482
+ }
440
483
  }
441
484
  }
442
485
  return results;
443
486
  }
444
487
  getDiagnostics() {
445
- const [components, guides, composables, directives, plugins, helpers] = [
488
+ const [components, guides, composables, directives, plugins, utils, nodeItems] = [
446
489
  this.getAllComponents(),
447
490
  this.getAllGuides(),
448
491
  this.getAllComposables(),
449
492
  this.getAllDirectives(),
450
493
  this.getAllPlugins(),
451
- this.getAllHelpers()
494
+ this.getAllUtils(),
495
+ this.getAllNode()
452
496
  ];
453
497
  let withManualDoc = 0;
454
498
  let withGeneratedDoc = 0;
@@ -486,9 +530,13 @@ ${generatedDoc}`;
486
530
  total: plugins.length,
487
531
  list: plugins
488
532
  },
489
- helpers: {
490
- total: helpers.length,
491
- list: helpers
533
+ utils: {
534
+ total: utils.length,
535
+ list: utils
536
+ },
537
+ node: {
538
+ total: nodeItems.length,
539
+ list: nodeItems
492
540
  },
493
541
  paths: {
494
542
  docsRoot: this.docsRoot,
@@ -498,7 +546,10 @@ ${generatedDoc}`;
498
546
  composablesDir: this.composablesDir,
499
547
  directivesDir: this.directivesDir,
500
548
  pluginsDir: this.pluginsDir,
501
- helpersDir: this.helpersDir
549
+ ecosystemDir: this.ecosystemDir,
550
+ utilsDir: this.utilsDir,
551
+ nodeDir: this.nodeDir,
552
+ iconsDir: this.iconsDir
502
553
  }
503
554
  };
504
555
  }
@@ -926,24 +977,44 @@ class MazUiMcpServer {
926
977
  uri: `plugin://${plugin}`
927
978
  });
928
979
  }
929
- const helpers = this.documentationService.getAllHelpers();
930
- for (const helper of helpers) {
931
- const helperType = this.getHelperType(helper);
980
+ const utils = this.documentationService.getAllUtils();
981
+ for (const util of utils) {
982
+ const utilType = this.getUtilType(util);
932
983
  const tags = [
933
- "helper",
984
+ "util",
934
985
  "utility",
935
986
  "function",
936
- helper,
937
- helperType,
938
- ...this.generateSearchTags(helper)
987
+ "maz-ui-utils",
988
+ util,
989
+ utilType,
990
+ ...this.generateSearchTags(util)
939
991
  ];
940
992
  index.push({
941
- type: "helper",
942
- name: helper,
943
- displayName: `${helper} Helper`,
944
- description: `Utility helper: ${helper} - ${helperType} utility functions for data processing and manipulation`,
993
+ type: "util",
994
+ name: util,
995
+ displayName: `${util} Util`,
996
+ description: `Utility from @maz-ui/utils: ${util} - ${utilType} utility for data processing and manipulation`,
945
997
  tags,
946
- uri: `helper://${helper}`
998
+ uri: `util://${util}`
999
+ });
1000
+ }
1001
+ const nodeItems = this.documentationService.getAllNode();
1002
+ for (const nodeItem of nodeItems) {
1003
+ const tags = [
1004
+ "node",
1005
+ "server",
1006
+ "cli",
1007
+ "maz-ui-node",
1008
+ nodeItem,
1009
+ ...this.generateSearchTags(nodeItem)
1010
+ ];
1011
+ index.push({
1012
+ type: "node",
1013
+ name: nodeItem,
1014
+ displayName: `${nodeItem} Node Utility`,
1015
+ description: `Node.js utility from @maz-ui/node: ${nodeItem} - server-side helper for scripts, CLI and SSR runtimes`,
1016
+ tags,
1017
+ uri: `node://${nodeItem}`
947
1018
  });
948
1019
  }
949
1020
  this.documentationIndex = index;
@@ -1016,10 +1087,10 @@ class MazUiMcpServer {
1016
1087
  return "general";
1017
1088
  }
1018
1089
  /**
1019
- * Determine helper type for better categorization
1090
+ * Determine util type for better categorization
1020
1091
  */
1021
- getHelperType(helperName) {
1022
- const lowerName = helperName.toLowerCase();
1092
+ getUtilType(utilName) {
1093
+ const lowerName = utilName.toLowerCase();
1023
1094
  if (lowerName.includes("string") || lowerName.includes("text"))
1024
1095
  return "string";
1025
1096
  if (lowerName.includes("date") || lowerName.includes("time"))
@@ -1145,9 +1216,10 @@ class MazUiMcpServer {
1145
1216
  composable: "Composables",
1146
1217
  directive: "Directives",
1147
1218
  plugin: "Plugins",
1148
- helper: "Helpers"
1219
+ util: "Utils",
1220
+ node: "Node Utilities"
1149
1221
  };
1150
- const typeOrder = ["component", "guide", "composable", "directive", "plugin", "helper"];
1222
+ const typeOrder = ["component", "guide", "composable", "directive", "plugin", "util", "node"];
1151
1223
  let result = `# Maz-UI Documentation (${filteredIndex.length} items)
1152
1224
 
1153
1225
  `;
@@ -1230,7 +1302,8 @@ ${suggestions}
1230
1302
  composable: (name) => this.documentationService.getComposableDocumentation(name),
1231
1303
  directive: (name) => this.documentationService.getDirectiveDocumentation(name),
1232
1304
  plugin: (name) => this.documentationService.getPluginDocumentation(name),
1233
- helper: (name) => this.documentationService.getHelperDocumentation(name)
1305
+ util: (name) => this.documentationService.getUtilDocumentation(name),
1306
+ node: (name) => this.documentationService.getNodeDocumentation(name)
1234
1307
  };
1235
1308
  const getContent = contentMethods[doc.type];
1236
1309
  return getContent ? getContent(doc.name) : "";
@@ -1277,7 +1350,8 @@ ${suggestions}
1277
1350
  - **${diagnostics.composables.total} Composables** - Vue 3 reactive utilities
1278
1351
  - **${diagnostics.directives.total} Directives** - DOM helpers
1279
1352
  - **${diagnostics.plugins.total} Plugins** - App-wide services
1280
- - **${diagnostics.helpers.total} Helpers** - Utility functions
1353
+ - **${diagnostics.utils.total} Utils** - Utility functions from @maz-ui/utils
1354
+ - **${diagnostics.node.total} Node Utilities** - Server-side helpers from @maz-ui/node
1281
1355
  - **${diagnostics.guides.total} Guides** - Documentation
1282
1356
 
1283
1357
  ## Getting Started
@@ -1302,11 +1376,14 @@ Use the MCP tools to explore components and features:
1302
1376
  case "plugin":
1303
1377
  content = this.documentationService.getPluginDocumentation(name);
1304
1378
  break;
1305
- case "helper":
1306
- content = this.documentationService.getHelperDocumentation(name);
1379
+ case "util":
1380
+ content = this.documentationService.getUtilDocumentation(name);
1381
+ break;
1382
+ case "node":
1383
+ content = this.documentationService.getNodeDocumentation(name);
1307
1384
  break;
1308
1385
  default:
1309
- throw new Error(`Unknown resource type: ${type}. Valid types: overview, component, guide, composable, directive, plugin, helper`);
1386
+ throw new Error(`Unknown resource type: ${type}. Valid types: overview, component, guide, composable, directive, plugin, util, node`);
1310
1387
  }
1311
1388
  if (!content) {
1312
1389
  throw new Error(`Documentation not found for ${type}: ${name}`);
@@ -1337,7 +1414,7 @@ Use the MCP tools to explore components and features:
1337
1414
  },
1338
1415
  category: {
1339
1416
  type: "string",
1340
- enum: ["component", "guide", "composable", "directive", "plugin", "helper"],
1417
+ enum: ["component", "guide", "composable", "directive", "plugin", "util", "node"],
1341
1418
  description: "Optional filter to restrict results to a specific documentation category"
1342
1419
  },
1343
1420
  maxResults: {
@@ -1363,7 +1440,7 @@ Use the MCP tools to explore components and features:
1363
1440
  },
1364
1441
  type: {
1365
1442
  type: "string",
1366
- enum: ["auto", "component", "guide", "composable", "directive", "plugin", "helper"],
1443
+ enum: ["auto", "component", "guide", "composable", "directive", "plugin", "util", "node"],
1367
1444
  description: 'Type hint to improve search accuracy (optional). Use "auto" to search all types.',
1368
1445
  default: "auto"
1369
1446
  }
@@ -1373,13 +1450,13 @@ Use the MCP tools to explore components and features:
1373
1450
  },
1374
1451
  {
1375
1452
  name: "list",
1376
- description: "Browse all available Maz-UI documentation grouped by category. Returns a structured list with counters per category and for each item: name, displayName, description. Use this tool to discover what components, composables, directives, plugins, helpers, and guides are available. Examples: list all docs, list only components, list composables.",
1453
+ description: "Browse all available Maz-UI documentation grouped by category. Returns a structured list with counters per category and for each item: name, displayName, description. Use this tool to discover what components, composables, directives, plugins, utils, node utilities and guides are available. Examples: list all docs, list only components, list composables.",
1377
1454
  inputSchema: {
1378
1455
  type: "object",
1379
1456
  properties: {
1380
1457
  category: {
1381
1458
  type: "string",
1382
- enum: ["all", "component", "guide", "composable", "directive", "plugin", "helper"],
1459
+ enum: ["all", "component", "guide", "composable", "directive", "plugin", "util", "node"],
1383
1460
  description: 'Filter by documentation category. Use "all" or omit to see everything.',
1384
1461
  default: "all"
1385
1462
  }
@@ -236,7 +236,7 @@ export default defineNuxtConfig({
236
236
  To help with migration from v3 to v4:
237
237
 
238
238
  - **[Complete Migration Guide](../guide/migration-v4.md)** - Step-by-step migration instructions
239
- - **[MCP Integration](../guide/mcp.md)** - Connect AI agents for migration assistance
239
+ - **[MCP Integration](../ecosystem/mcp.md)** - Connect AI agents for migration assistance
240
240
  - **[Interactive Examples](../index.md)** - Live demonstrations of new features
241
241
  - **[Community Support](https://github.com/LouisMazel/maz-ui/discussions)** - Get help from the community
242
242
 
@@ -96,14 +96,14 @@ It handles the mechanical part of the migration (CSS subpath imports, prop renam
96
96
 
97
97
  A few changes need a human eye: `MazIcon` API (needs your original asset paths), `MazBadge` numeric size mapping, `foundation.radius` → `scales.rounded.md` reshape, and `MazChart` `update-mode` default.
98
98
 
99
- The [`@maz-ui/mcp`](/guide/mcp) server exposes the migration guide and every other Maz-UI doc to your AI assistant. Connect it once, then walk the guide section by section against your codebase — there's a [step-by-step flow](/guide/migration-v5#migrate-with-the-maz-ui-mcp-server) ready to copy-paste.
99
+ The [`@maz-ui/mcp`](/ecosystem/mcp) server exposes the migration guide and every other Maz-UI doc to your AI assistant. Connect it once, then walk the guide section by section against your codebase — there's a [step-by-step flow](/guide/migration-v5#migrate-with-the-maz-ui-mcp-server) ready to copy-paste.
100
100
 
101
101
  ```bash
102
102
  # Claude Code
103
103
  claude mcp add maz-ui npx @maz-ui/mcp --scope project
104
104
  ```
105
105
 
106
- Cursor, Windsurf, VS Code Copilot, Cline and Claude Desktop are all in the [MCP guide](/guide/mcp).
106
+ Cursor, Windsurf, VS Code Copilot, Cline and Claude Desktop are all in the [MCP guide](/ecosystem/mcp).
107
107
 
108
108
  ### The full guide
109
109
 
@@ -155,11 +155,11 @@ export default defineNuxtConfig({
155
155
  ## Essential Links
156
156
 
157
157
  - **[v5 Migration Guide](/guide/migration-v5)** — every breaking change, the upgrade CLI, the MCP flow
158
- - **[Theming](/guide/themes)** — preset authoring, `scales` and `components` blocks, runtime switching
158
+ - **[Theming](/ecosystem/themes)** — preset authoring, `scales` and `components` blocks, runtime switching
159
159
  - **[Browser Support](/guide/browser-support)** — minimum versions and the features they enable
160
160
  - **[Tailwind integration](/guide/tailwind)** — for consumers who ship their own Tailwind setup
161
161
  - **[`@maz-ui/upgrade` README](https://github.com/LouisMazel/maz-ui/tree/master/packages/upgrade)** — full transform list and CLI reference
162
- - **[Model Context Protocol (MCP)](/guide/mcp)** — connect AI assistants to the Maz-UI docs
162
+ - **[Model Context Protocol (MCP)](/ecosystem/mcp)** — connect AI assistants to the Maz-UI docs
163
163
  - **[GitHub Repository](https://github.com/LouisMazel/maz-ui)** — source code & issues
164
164
  - **[Changelog](https://github.com/LouisMazel/maz-ui/blob/master/CHANGELOG.md)** — detailed release notes
165
165
 
@@ -454,7 +454,7 @@ Check out how [MazIcon](./maz-icon.md) works, see all available icons and downlo
454
454
 
455
455
  :::
456
456
 
457
- ### Use [@maz-ui/icons](./../guide/icons.md)
457
+ ### Use [@maz-ui/icons](./../ecosystem/icons/.md)
458
458
 
459
459
  ::: details View code
460
460
 
@@ -896,7 +896,7 @@ const disabledHours = [0, 1, 2, 11, 22, 23]
896
896
 
897
897
  ## Internationalization
898
898
 
899
- MazDatePicker supports full internationalization. **By default, it uses the locale from the [MazUiTranslations](../guide/translations.md) plugin**, but you can override it:
899
+ MazDatePicker supports full internationalization. **By default, it uses the locale from the [MazUiTranslations](../ecosystem/translations.md) plugin**, but you can override it:
900
900
 
901
901
  <ComponentDemo>
902
902
  <div class="maz:grid maz:grid-cols-1 maz:mob-l:grid-cols-2 maz:gap-4">
@@ -8,7 +8,7 @@ description: A flexible icon component that accepts Vue components, raw SVG stri
8
8
  {{ $frontmatter.description }}
9
9
 
10
10
  ::: tip
11
- Download the bundled [icons pack](#all-bundled-icons) or use [`@maz-ui/icons`](../guide/icons.md) for the full set.
11
+ Download the bundled [icons pack](#all-bundled-icons) or use [`@maz-ui/icons`](../ecosystem/icons/.md) for the full set.
12
12
  :::
13
13
 
14
14
  ## How it works
@@ -220,7 +220,7 @@ This pack is the Heroicons set plus a few additions specific to maz-ui.
220
220
  Download pack
221
221
  </MazBtn>
222
222
 
223
- Source: [Heroicons](https://heroicons.com/) — see also the [icon set page](./../guide/icon-set.md).
223
+ Source: [Heroicons](https://heroicons.com/) — see also the [icon set page](./../ecosystem/icons/icon-set.md).
224
224
 
225
225
  <div class="flex items-start flex-wrap gap-05">
226
226
  <div v-for="({ component, name }, i) in iconsList" :key="i" class="flex flex-col flex-center maz:p-2 maz:rounded-md maz:border">
@@ -242,7 +242,7 @@ app.mount('#app')
242
242
 
243
243
  ### Nuxt
244
244
 
245
- Please refer to the [Nuxt module documentation](./../guide/nuxt.md) for more information.
245
+ Please refer to the [Nuxt module documentation](./../ecosystem/nuxt.md) for more information.
246
246
 
247
247
  <script lang="ts" setup>
248
248
  import { ref } from 'vue'
@@ -83,7 +83,7 @@ app.mount('#app')
83
83
 
84
84
  ### Nuxt
85
85
 
86
- Please refer to the [Nuxt module documentation](./../guide/nuxt.md) for more information.
86
+ Please refer to the [Nuxt module documentation](./../ecosystem/nuxt.md) for more information.
87
87
 
88
88
  ## Types
89
89