@maltjoy/mcp-server 0.4.0 → 0.6.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -3
  3. package/dist/doc/VJoyAdminBanner/guideline.md +284 -0
  4. package/dist/doc/VJoyAvailability/guideline.md +352 -0
  5. package/dist/doc/VJoyAvatar/guideline.md +192 -0
  6. package/dist/doc/VJoyAvatarsList/guideline.md +328 -0
  7. package/dist/doc/VJoyBadge/guideline.md +169 -0
  8. package/dist/doc/VJoyBadgeLevel/guideline.md +166 -0
  9. package/dist/doc/VJoyBlockSkeleton/guideline.md +150 -0
  10. package/dist/doc/VJoyBottomSheet/guideline.md +345 -0
  11. package/dist/doc/VJoyBottomSheetTrigger/guideline.md +156 -0
  12. package/dist/doc/VJoyButton/guideline.md +371 -0
  13. package/dist/doc/VJoyButton/metadata.json +0 -16
  14. package/dist/doc/VJoyButtonCard/guideline.md +384 -0
  15. package/dist/doc/VJoyCheckbox/guideline.md +317 -0
  16. package/dist/doc/VJoyCheckboxCard/guideline.md +381 -0
  17. package/dist/doc/VJoyCheckboxGroup/guideline.md +363 -0
  18. package/dist/doc/VJoyCheckboxGroup/metadata.json +7 -7
  19. package/dist/doc/VJoyCollapse/guideline.md +362 -0
  20. package/dist/doc/VJoyCollapseItem/guideline.md +394 -0
  21. package/dist/doc/VJoyCompanyAvatar/guideline.md +162 -0
  22. package/dist/doc/VJoyDialog/guideline.md +425 -0
  23. package/dist/doc/VJoyDialogTrigger/guideline.md +186 -0
  24. package/dist/doc/VJoyDot/guideline.md +177 -0
  25. package/dist/doc/VJoyDrawer/guideline.md +392 -0
  26. package/dist/doc/VJoyDrawerTrigger/guideline.md +145 -0
  27. package/dist/doc/VJoyDropdown/guideline.md +393 -0
  28. package/dist/doc/VJoyDropdown/metadata.json +6 -6
  29. package/dist/doc/VJoyDropdownList/guideline.md +396 -0
  30. package/dist/doc/VJoyDropdownList/metadata.json +7 -7
  31. package/dist/doc/VJoyDropzone/guideline.md +390 -0
  32. package/dist/doc/VJoyDropzone/metadata.json +36 -1
  33. package/dist/doc/VJoyFilterBar/guideline.md +419 -0
  34. package/dist/doc/VJoyFilterBarButton/guideline.md +359 -0
  35. package/dist/doc/VJoyFloatingActionsBar/guideline.md +372 -0
  36. package/dist/doc/VJoyFormError/guideline.md +325 -0
  37. package/dist/doc/VJoyFormError/metadata.json +0 -14
  38. package/dist/doc/VJoyFormFieldSkeleton/guideline.md +159 -0
  39. package/dist/doc/VJoyFormGroup/guideline.md +285 -0
  40. package/dist/doc/VJoyFunnel/guideline.md +349 -0
  41. package/dist/doc/VJoyFunnelFooter/guideline.md +178 -0
  42. package/dist/doc/VJoyFunnelHeader/guideline.md +204 -0
  43. package/dist/doc/VJoyHighlight/guideline.md +169 -0
  44. package/dist/doc/VJoyIcon/JoyIcon.types.ts +1 -1
  45. package/dist/doc/VJoyIcon/guideline.md +168 -0
  46. package/dist/doc/VJoyIcon/metadata.json +0 -1
  47. package/dist/doc/VJoyIconButton/guideline.md +169 -0
  48. package/dist/doc/VJoyIconButton/metadata.json +1 -1
  49. package/dist/doc/VJoyIndicator/guideline.md +168 -0
  50. package/dist/doc/VJoyIndicators/guideline.md +183 -0
  51. package/dist/doc/VJoyInput/JoyInput.types.ts +1 -6
  52. package/dist/doc/VJoyInput/guideline.md +401 -0
  53. package/dist/doc/VJoyInput/metadata.json +5 -14
  54. package/dist/doc/VJoyInputDigit/guideline.md +381 -0
  55. package/dist/doc/VJoyInputNumber/guideline.md +414 -0
  56. package/dist/doc/VJoyInputNumber/metadata.json +22 -17
  57. package/dist/doc/VJoyInputPassword/guideline.md +379 -0
  58. package/dist/doc/VJoyInputPassword/metadata.json +0 -14
  59. package/dist/doc/VJoyLabel/guideline.md +200 -0
  60. package/dist/doc/VJoyLink/guideline.md +360 -0
  61. package/dist/doc/VJoyListItem/guideline.md +335 -0
  62. package/dist/doc/VJoyMenu/guideline.md +304 -0
  63. package/dist/doc/VJoyMenu/metadata.json +21 -21
  64. package/dist/doc/VJoyMenuItem/guideline.md +352 -0
  65. package/dist/doc/VJoyPagination/guideline.md +355 -0
  66. package/dist/doc/VJoyPanel/guideline.md +238 -0
  67. package/dist/doc/VJoyPanelSection/guideline.md +160 -0
  68. package/dist/doc/VJoyPasswordRequirement/guideline.md +336 -0
  69. package/dist/doc/VJoyPasswordRequirement/metadata.json +1 -1
  70. package/dist/doc/VJoyProductTour/JoyProductTour.types.ts +0 -1
  71. package/dist/doc/VJoyProductTour/guideline.md +455 -0
  72. package/dist/doc/VJoyProductTour/metadata.json +1 -1
  73. package/dist/doc/VJoyProductTourTrigger/guideline.md +167 -0
  74. package/dist/doc/VJoyProgressBar/guideline.md +348 -0
  75. package/dist/doc/VJoyRadio/guideline.md +346 -0
  76. package/dist/doc/VJoyRadioGroup/guideline.md +331 -0
  77. package/dist/doc/VJoyRatingStars/guideline.md +306 -0
  78. package/dist/doc/VJoyScreenLoader/guideline.md +172 -0
  79. package/dist/doc/VJoySelect/guideline.md +396 -0
  80. package/dist/doc/VJoySelectableItem/guideline.md +351 -0
  81. package/dist/doc/VJoySelectableItemGroup/guideline.md +370 -0
  82. package/dist/doc/VJoySeparator/guideline.md +161 -0
  83. package/dist/doc/VJoySnackbar/guideline.md +402 -0
  84. package/dist/doc/VJoySpinner/guideline.md +168 -0
  85. package/dist/doc/VJoyStep/guideline.md +182 -0
  86. package/dist/doc/VJoyStepper/guideline.md +390 -0
  87. package/dist/doc/VJoyTab/guideline.md +298 -0
  88. package/dist/doc/VJoyTabs/guideline.md +353 -0
  89. package/dist/doc/VJoyTag/guideline.md +226 -0
  90. package/dist/doc/VJoyTagsInput/guideline.md +387 -0
  91. package/dist/doc/VJoyTagsList/guideline.md +311 -0
  92. package/dist/doc/VJoyTagsList/metadata.json +27 -27
  93. package/dist/doc/VJoyTemplate/guideline.md +366 -0
  94. package/dist/doc/VJoyText/guideline.md +175 -0
  95. package/dist/doc/VJoyText/metadata.json +1 -1
  96. package/dist/doc/VJoyTextarea/guideline.md +378 -0
  97. package/dist/doc/VJoyTitleBrand/guideline.md +155 -0
  98. package/dist/doc/VJoyToggle/guideline.md +327 -0
  99. package/dist/doc/VJoyTooltip/guideline.md +322 -0
  100. package/dist/doc/VJoyUserCard/guideline.md +268 -0
  101. package/dist/doc/VJoyUserCard/metadata.json +3 -17
  102. package/dist/doc/VJoyWalkthrough/guideline.md +351 -0
  103. package/dist/doc/VJoyWalkthroughTrigger/guideline.md +171 -0
  104. package/dist/doc/VJoyWrapper/guideline.md +173 -0
  105. package/dist/doc/css-classes.json +1 -15
  106. package/dist/doc/design-tokens.json +1 -0
  107. package/dist/doc/index.json +20 -30
  108. package/dist/index.js +22 -2
  109. package/dist/index.js.map +1 -1
  110. package/dist/tools/get-component-guideline.d.ts +30 -0
  111. package/dist/tools/get-component-guideline.d.ts.map +1 -0
  112. package/dist/tools/get-component-guideline.js +51 -0
  113. package/dist/tools/get-component-guideline.js.map +1 -0
  114. package/dist/tools/get-documentation-page.d.ts +22 -0
  115. package/dist/tools/get-documentation-page.d.ts.map +1 -0
  116. package/dist/tools/get-documentation-page.js +21 -0
  117. package/dist/tools/get-documentation-page.js.map +1 -0
  118. package/dist/tools/list-documentation-pages.d.ts +22 -0
  119. package/dist/tools/list-documentation-pages.d.ts.map +1 -0
  120. package/dist/tools/list-documentation-pages.js +17 -0
  121. package/dist/tools/list-documentation-pages.js.map +1 -0
  122. package/dist/tools/search-documentation.d.ts +41 -0
  123. package/dist/tools/search-documentation.d.ts.map +1 -0
  124. package/dist/tools/search-documentation.js +25 -0
  125. package/dist/tools/search-documentation.js.map +1 -0
  126. package/dist/zeroheight-parser.d.ts +27 -0
  127. package/dist/zeroheight-parser.d.ts.map +1 -0
  128. package/dist/zeroheight-parser.js +77 -0
  129. package/dist/zeroheight-parser.js.map +1 -0
  130. package/package.json +10 -10
  131. package/dist/doc/VJoyMultiCheckbox/metadata.json +0 -332
@@ -0,0 +1,51 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ /**
7
+ * Tool definition for retrieving the DSDS usage guideline markdown for a Joy component.
8
+ */
9
+ export const getComponentGuidelineTool = {
10
+ name: 'joy_get_component_guideline',
11
+ description: 'Retrieves the DSDS usage guideline Markdown for a Joy Vue3 component. ' +
12
+ 'Includes when to use / not use, anatomy, variants, best practices (MUST / SHOULD), ' +
13
+ 'accessibility, examples, and agent rules. ' +
14
+ 'Use this after joy_get_component_info when you need usage guidance — not a props dump. ' +
15
+ 'Provide the exact component name (e.g., VJoyButton).',
16
+ inputSchema: {
17
+ type: 'object',
18
+ properties: {
19
+ componentName: {
20
+ type: 'string',
21
+ description: 'The exact name of the component (e.g., VJoyButton, VJoyInput)',
22
+ },
23
+ },
24
+ required: ['componentName'],
25
+ },
26
+ };
27
+ /**
28
+ * Handler for joy_get_component_guideline
29
+ */
30
+ export async function handleGetComponentGuideline(componentName) {
31
+ if (!componentName || typeof componentName !== 'string') {
32
+ return {
33
+ error: 'Invalid component name. Please provide a valid component name (e.g., VJoyButton).',
34
+ };
35
+ }
36
+ const guidelinePath = join(__dirname, '..', 'doc', componentName, 'guideline.md');
37
+ if (!existsSync(guidelinePath)) {
38
+ return {
39
+ error: `No DSDS guideline found for component "${componentName}". ` +
40
+ 'Use joy_list_components to get a list of available components, ' +
41
+ 'or joy_get_component_info for the API surface.',
42
+ };
43
+ }
44
+ return {
45
+ componentName,
46
+ format: 'markdown',
47
+ source: 'DSDS.guideline.md',
48
+ content: readFileSync(guidelinePath, 'utf-8'),
49
+ };
50
+ }
51
+ //# sourceMappingURL=get-component-guideline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-component-guideline.js","sourceRoot":"","sources":["../../src/tools/get-component-guideline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAClC,OAAO,EAAC,OAAO,EAAE,IAAI,EAAC,MAAM,MAAM,CAAC;AAEnC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACrC,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACP,wEAAwE;QACxE,qFAAqF;QACrF,4CAA4C;QAC5C,yFAAyF;QACzF,sDAAsD;IAC1D,WAAW,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,aAAa,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+DAA+D;aAC/E;SACJ;QACD,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC9B;CACJ,CAAC;AASF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC7C,aAAqB;IAErB,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO;YACH,KAAK,EAAE,mFAAmF;SAC7F,CAAC;IACN,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IAElF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7B,OAAO;YACH,KAAK,EACD,0CAA0C,aAAa,KAAK;gBAC5D,iEAAiE;gBACjE,gDAAgD;SACvD,CAAC;IACN,CAAC;IAED,OAAO;QACH,aAAa;QACb,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC;KAChD,CAAC;AACN,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare const getDocumentationPageTool: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: string;
6
+ properties: {
7
+ page: {
8
+ type: string;
9
+ description: string;
10
+ };
11
+ section: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ };
16
+ required: string[];
17
+ };
18
+ };
19
+ export declare function handleGetDocumentationPage(page: string, section?: string): Promise<import("../zeroheight-parser.js").DocumentationPage | {
20
+ error: string;
21
+ }>;
22
+ //# sourceMappingURL=get-documentation-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-documentation-page.d.ts","sourceRoot":"","sources":["../../src/tools/get-documentation-page.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;CAWpC,CAAC;AAEF,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;;GAM9E"}
@@ -0,0 +1,21 @@
1
+ import { getDocumentationPage } from '../zeroheight-parser.js';
2
+ export const getDocumentationPageTool = {
3
+ name: 'joy_get_documentation_page',
4
+ description: 'Retrieves a locally extracted Zeroheight page by its stable page id or slug. Request a section to keep responses focused; omit it or use "all" for every section.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ page: { type: 'string', description: 'Zeroheight page id or slug from joy_list_documentation_pages.' },
9
+ section: { type: 'string', description: 'Optional section filename without .md, or "all".' },
10
+ },
11
+ required: ['page'],
12
+ },
13
+ };
14
+ export async function handleGetDocumentationPage(page, section) {
15
+ if (!page || typeof page !== 'string') {
16
+ return { error: 'Invalid page. Provide a page id or slug from joy_list_documentation_pages.' };
17
+ }
18
+ const documentationPage = getDocumentationPage(page, section);
19
+ return documentationPage || { error: `Documentation page "${page}" was not found.` };
20
+ }
21
+ //# sourceMappingURL=get-documentation-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-documentation-page.js","sourceRoot":"","sources":["../../src/tools/get-documentation-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,yBAAyB,CAAC;AAE7D,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE,mKAAmK;IAChL,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAC;YACpG,OAAO,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kDAAkD,EAAC;SAC3F;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY,EAAE,OAAgB;IAC7E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,EAAC,KAAK,EAAE,4EAA4E,EAAC,CAAC;IAC/F,CAAC;IACD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,iBAAiB,IAAI,EAAC,KAAK,EAAE,uBAAuB,IAAI,kBAAkB,EAAC,CAAC;AACrF,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare const listDocumentationPagesTool: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: string;
6
+ properties: {
7
+ category: {
8
+ type: string;
9
+ description: string;
10
+ };
11
+ componentName: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ };
16
+ };
17
+ };
18
+ export declare function handleListDocumentationPages(category?: string, componentName?: string): Promise<{
19
+ pages: import("../zeroheight-parser.js").DocumentationPageSummary[];
20
+ count: number;
21
+ }>;
22
+ //# sourceMappingURL=list-documentation-pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-documentation-pages.d.ts","sourceRoot":"","sources":["../../src/tools/list-documentation-pages.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;CAUtC,CAAC;AAEF,wBAAsB,4BAA4B,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;;;GAG3F"}
@@ -0,0 +1,17 @@
1
+ import { listDocumentationPages } from '../zeroheight-parser.js';
2
+ export const listDocumentationPagesTool = {
3
+ name: 'joy_list_documentation_pages',
4
+ description: 'Lists locally extracted Zeroheight design-system pages. Use category or componentName to narrow the result.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ category: { type: 'string', description: 'Optional documentation category.' },
9
+ componentName: { type: 'string', description: 'Optional Joy component name, for example VJoyButton.' },
10
+ },
11
+ },
12
+ };
13
+ export async function handleListDocumentationPages(category, componentName) {
14
+ const pages = listDocumentationPages(category, componentName);
15
+ return { pages, count: pages.length };
16
+ }
17
+ //# sourceMappingURL=list-documentation-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-documentation-pages.js","sourceRoot":"","sources":["../../src/tools/list-documentation-pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAE/D,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,IAAI,EAAE,8BAA8B;IACpC,WAAW,EAAE,6GAA6G;IAC1H,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAC;YAC3E,aAAa,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sDAAsD,EAAC;SACrG;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,QAAiB,EAAE,aAAsB;IAC1F,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC9D,OAAO,EAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,41 @@
1
+ export declare const searchDocumentationTool: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: string;
6
+ properties: {
7
+ query: {
8
+ type: string;
9
+ description: string;
10
+ };
11
+ componentName: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ limit: {
16
+ type: string;
17
+ description: string;
18
+ };
19
+ };
20
+ required: string[];
21
+ };
22
+ };
23
+ export declare function handleSearchDocumentation(query: string, componentName?: string, limit?: number): Promise<{
24
+ error: string;
25
+ query?: undefined;
26
+ matches?: undefined;
27
+ count?: undefined;
28
+ } | {
29
+ query: string;
30
+ matches: {
31
+ id: string;
32
+ title: string;
33
+ slug: string;
34
+ category: string;
35
+ section: string;
36
+ excerpt: string;
37
+ }[];
38
+ count: number;
39
+ error?: undefined;
40
+ }>;
41
+ //# sourceMappingURL=search-documentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-documentation.d.ts","sourceRoot":"","sources":["../../src/tools/search-documentation.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;CAYnC,CAAC;AAEF,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;GASpG"}
@@ -0,0 +1,25 @@
1
+ import { searchDocumentation } from '../zeroheight-parser.js';
2
+ export const searchDocumentationTool = {
3
+ name: 'joy_search_documentation',
4
+ description: 'Searches text extracted from Zeroheight documentation and returns concise section excerpts.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ query: { type: 'string', description: 'Case-insensitive text to search for.' },
9
+ componentName: { type: 'string', description: 'Optional Joy component name filter.' },
10
+ limit: { type: 'number', description: 'Maximum number of matches. Defaults to 10.' },
11
+ },
12
+ required: ['query'],
13
+ },
14
+ };
15
+ export async function handleSearchDocumentation(query, componentName, limit) {
16
+ if (!query || typeof query !== 'string') {
17
+ return { error: 'Invalid query. Provide a non-empty search string.' };
18
+ }
19
+ const safeLimit = typeof limit === 'number' && Number.isInteger(limit)
20
+ ? Math.max(1, Math.min(limit, 50))
21
+ : 10;
22
+ const matches = searchDocumentation(query, componentName, safeLimit);
23
+ return { query, matches, count: matches.length };
24
+ }
25
+ //# sourceMappingURL=search-documentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-documentation.js","sourceRoot":"","sources":["../../src/tools/search-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAE5D,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,6FAA6F;IAC1G,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAC;YAC5E,aAAa,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAC;YACnF,KAAK,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAC;SACnF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAAa,EAAE,aAAsB,EAAE,KAAc;IACnG,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAC,KAAK,EAAE,mDAAmD,EAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACpE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACrE,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface DocumentationPageSummary {
2
+ id: string;
3
+ title: string;
4
+ slug: string;
5
+ category: string;
6
+ component: string | null;
7
+ source: string;
8
+ fetchedAt: string;
9
+ sections: string[];
10
+ path: string;
11
+ }
12
+ export interface DocumentationPage extends DocumentationPageSummary {
13
+ metadata: Record<string, unknown>;
14
+ content: Record<string, string>;
15
+ }
16
+ export declare function listDocumentationPages(category?: string, componentName?: string): DocumentationPageSummary[];
17
+ export declare function getDocumentationPage(identifier: string, section?: string): DocumentationPage | null;
18
+ export declare function searchDocumentation(query: string, componentName?: string, limit?: number): {
19
+ id: string;
20
+ title: string;
21
+ slug: string;
22
+ category: string;
23
+ section: string;
24
+ excerpt: string;
25
+ }[];
26
+ export declare function documentationMatchesComponent(page: DocumentationPageSummary, componentName: string): boolean;
27
+ //# sourceMappingURL=zeroheight-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zeroheight-parser.d.ts","sourceRoot":"","sources":["../src/zeroheight-parser.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAWD,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE,CAW5G;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAqBnG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK;QAEzD,MAAM;WAAS,MAAM;UAAQ,MAAM;cAAY,MAAM;aAAW,MAAM;aAAW,MAAM;IAmBlH;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAI5G"}
@@ -0,0 +1,77 @@
1
+ import { readFileSync } from 'fs';
2
+ import { dirname, join } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ const zeroheightRoot = join(__dirname, 'doc', 'zeroheight');
6
+ function readIndex() {
7
+ const content = readFileSync(join(zeroheightRoot, 'index.json'), 'utf8');
8
+ return JSON.parse(content);
9
+ }
10
+ export function listDocumentationPages(category, componentName) {
11
+ try {
12
+ return readIndex().pages.filter((page) => {
13
+ const categoryMatches = !category || page.category.toLowerCase() === category.toLowerCase();
14
+ const componentMatches = !componentName || documentationMatchesComponent(page, componentName);
15
+ return categoryMatches && componentMatches;
16
+ });
17
+ }
18
+ catch (error) {
19
+ console.error('Error reading Zeroheight documentation index:', error);
20
+ return [];
21
+ }
22
+ }
23
+ export function getDocumentationPage(identifier, section) {
24
+ try {
25
+ const page = readIndex().pages.find((candidate) => candidate.id === identifier || candidate.slug === identifier);
26
+ if (!page)
27
+ return null;
28
+ const directory = join(zeroheightRoot, page.path);
29
+ const requestedSections = section && section !== 'all' ? [section] : page.sections;
30
+ const content = {};
31
+ for (const sectionName of requestedSections) {
32
+ if (!page.sections.includes(sectionName))
33
+ continue;
34
+ content[sectionName] = readFileSync(join(directory, `${sectionName}.md`), 'utf8');
35
+ }
36
+ return {
37
+ ...page,
38
+ metadata: JSON.parse(readFileSync(join(directory, 'meta.json'), 'utf8')),
39
+ content,
40
+ };
41
+ }
42
+ catch (error) {
43
+ console.error(`Error reading Zeroheight documentation page "${identifier}":`, error);
44
+ return null;
45
+ }
46
+ }
47
+ export function searchDocumentation(query, componentName, limit = 10) {
48
+ const normalizedQuery = query.toLowerCase();
49
+ const matches = [];
50
+ for (const page of listDocumentationPages(undefined, componentName)) {
51
+ const fullPage = getDocumentationPage(page.id);
52
+ if (!fullPage)
53
+ continue;
54
+ for (const [section, markdown] of Object.entries(fullPage.content)) {
55
+ const index = markdown.toLowerCase().indexOf(normalizedQuery);
56
+ if (index === -1)
57
+ continue;
58
+ matches.push({
59
+ id: page.id,
60
+ title: page.title,
61
+ slug: page.slug,
62
+ category: page.category,
63
+ section,
64
+ excerpt: markdown.slice(Math.max(0, index - 120), index + query.length + 120).replace(/\s+/g, ' ').trim(),
65
+ });
66
+ if (matches.length >= limit)
67
+ return matches;
68
+ }
69
+ }
70
+ return matches;
71
+ }
72
+ export function documentationMatchesComponent(page, componentName) {
73
+ const normalizedComponent = componentName.toLowerCase().replace(/^vjoy/, '').replace(/[^a-z0-9]/g, '');
74
+ const normalizedPage = page.title.toLowerCase().replace(/[^a-z0-9]/g, '');
75
+ return page.component?.toLowerCase() === componentName.toLowerCase() || normalizedPage === normalizedComponent;
76
+ }
77
+ //# sourceMappingURL=zeroheight-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zeroheight-parser.js","sourceRoot":"","sources":["../src/zeroheight-parser.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maltjoy/mcp-server",
3
- "version": "0.4.0",
3
+ "version": "0.6.0-beta.0",
4
4
  "description": "MCP server for Joy Design System - exposes Vue3 components information",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,13 +10,6 @@
10
10
  "files": [
11
11
  "dist"
12
12
  ],
13
- "scripts": {
14
- "build": "tsc && npm run generate:components-docs:json",
15
- "dev": "tsc --watch",
16
- "start": "node dist/index.js",
17
- "generate:components-docs:json": "tsx src/json-metadata-generator.mjs",
18
- "inspector": "pnpx @modelcontextprotocol/inspector node ./dist/index.js"
19
- },
20
13
  "keywords": [
21
14
  "mcp",
22
15
  "design-system",
@@ -30,9 +23,16 @@
30
23
  "@modelcontextprotocol/sdk": "1.25.2"
31
24
  },
32
25
  "devDependencies": {
33
- "@types/node": "20.14.2",
26
+ "@types/node": "24.12.0",
34
27
  "tsx": "^4.21.0",
35
28
  "typescript": "5.3.3",
36
29
  "vue-component-meta": "3.1.5"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc && npm run generate:components-docs:json",
33
+ "dev": "tsc --watch",
34
+ "start": "node dist/index.js",
35
+ "generate:components-docs:json": "tsx src/json-metadata-generator.mjs",
36
+ "inspector": "pnpx @modelcontextprotocol/inspector node ./dist/index.js"
37
37
  }
38
- }
38
+ }