vlossom-mcp 0.3.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BpE,wBAAgB,YAAY,IAAI,SAAS,CAYxC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCpE,wBAAgB,YAAY,IAAI,SAAS,CAexC"}
package/dist/server.js CHANGED
@@ -3,6 +3,9 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { registerListComponents } from "./tools/list-components.js";
4
4
  import { registerGetComponent } from "./tools/get-component.js";
5
5
  import { registerSearchComponents } from "./tools/search-components.js";
6
+ import { registerSuggestComponents } from "./tools/suggest-components.js";
7
+ import { registerGetComponentRelationships } from "./tools/get-relationships.js";
8
+ import { registerCompareComponents } from "./tools/compare-components.js";
6
9
  import { registerCheckGitHubToken } from "./tools/check-github-token.js";
7
10
  import { registerSetGitHubToken } from "./tools/set-github-token.js";
8
11
  import { registerDraftIssue } from "./tools/draft-issue.js";
@@ -15,8 +18,11 @@ Tool call flow guide:
15
18
  - To list all components: list_components
16
19
  - To look up a specific component: get_component (accepts VsButton or vs-button)
17
20
  - To search components by keyword or use case: search_components → get_component for each result
21
+ - To suggest components for a use case or feature: suggest_components → get_component for each result
22
+ - To get component composition/relationships: get_component_relationships
23
+ - To compare two components: compare_components
18
24
  - To generate component code:
19
- 1. search_components (find relevant components)
25
+ 1. suggest_components (recommend components for the use case)
20
26
  2. get_component (check props/StyleSet for each)
21
27
  3. generate_component_code (generate code)
22
28
  - To file a GitHub issue: check_github_token → set_github_token (if needed) → draft_issue → report_issue
@@ -28,6 +34,9 @@ export function createServer() {
28
34
  registerListComponents(server);
29
35
  registerGetComponent(server);
30
36
  registerSearchComponents(server);
37
+ registerSuggestComponents(server);
38
+ registerGetComponentRelationships(server);
39
+ registerCompareComponents(server);
31
40
  registerCheckGitHubToken(server);
32
41
  registerSetGitHubToken(server);
33
42
  registerDraftIssue(server);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,YAAY,GAAG;;;;;;;;;;;;;CAapB,CAAC;AAEF,MAAM,UAAU,YAAY;IACxB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAE/F,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;CAgBpB,CAAC;AAEF,MAAM,UAAU,YAAY;IACxB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAE/F,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC1C,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ComponentRelationships {
2
+ parent: string[];
3
+ children: string[];
4
+ siblings: string[];
5
+ }
6
+ export declare function getRelationships(name: string): ComponentRelationships;
7
+ //# sourceMappingURL=relationships-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships-registry.d.ts","sourceRoot":"","sources":["../../src/services/relationships-registry.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAarE"}
@@ -0,0 +1,34 @@
1
+ import { createRequire } from "module";
2
+ import { dirname } from "path";
3
+ import { fileURLToPath } from "url";
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ const require = createRequire(import.meta.url);
6
+ let cache = null;
7
+ function loadRelationships() {
8
+ const jsonPath = `${__dirname}/../data/relationships.json`;
9
+ return require(jsonPath);
10
+ }
11
+ function getRelationshipsData() {
12
+ if (cache)
13
+ return cache;
14
+ cache = loadRelationships();
15
+ return cache;
16
+ }
17
+ function kebabToPascalCase(kebab) {
18
+ return kebab
19
+ .split("-")
20
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
21
+ .join("");
22
+ }
23
+ export function getRelationships(name) {
24
+ const data = getRelationshipsData();
25
+ const normalized = name.includes("-") ? kebabToPascalCase(name) : name;
26
+ const entry = data[normalized];
27
+ const children = entry?.children ?? [];
28
+ const siblings = entry?.siblings ?? [];
29
+ const parent = Object.entries(data)
30
+ .filter(([, rel]) => rel.children?.includes(normalized))
31
+ .map(([key]) => key);
32
+ return { parent, children, siblings };
33
+ }
34
+ //# sourceMappingURL=relationships-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships-registry.js","sourceRoot":"","sources":["../../src/services/relationships-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAS/C,IAAI,KAAK,GAA6B,IAAI,CAAC;AAE3C,SAAS,iBAAiB;IACtB,MAAM,QAAQ,GAAG,GAAG,SAAS,6BAA6B,CAAC;IAC3D,OAAO,OAAO,CAAC,QAAQ,CAAsB,CAAC;AAClD,CAAC;AAED,SAAS,oBAAoB;IACzB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAC5B,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACpC,OAAO,KAAK;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAEzB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerCompareComponents(server: McpServer): void;
3
+ //# sourceMappingURL=compare-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-components.d.ts","sourceRoot":"","sources":["../../src/tools/compare-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuGpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8CjE"}
@@ -0,0 +1,109 @@
1
+ import { z } from "zod";
2
+ import { getComponentMeta } from "../services/meta-registry.js";
3
+ import { textResponse } from "../utils/mcp-response.js";
4
+ const RECOMMENDATIONS = {
5
+ "VsModal vs VsDrawer": "Use VsModal for centered dialogs requiring user attention. Use VsDrawer for side panels and navigation menus.",
6
+ "VsInput vs VsTextarea": "Use VsInput for single-line text. Use VsTextarea for multi-line content.",
7
+ "VsInput vs VsSearchInput": "Use VsInput for general text input. Use VsSearchInput when you need built-in search functionality with regex/case options.",
8
+ "VsSelect vs VsRadio": "Use VsSelect for dropdown selection (space-efficient). Use VsRadio when all options should be visible simultaneously.",
9
+ "VsCheckbox vs VsSwitch": "Use VsCheckbox for multi-select or form submission. Use VsSwitch for immediate binary on/off toggles.",
10
+ "VsLoading vs VsSkeleton": "Use VsLoading for action feedback (button clicks, data fetching). Use VsSkeleton as a content placeholder while page data loads.",
11
+ "VsToast vs VsModal": "Use VsToast for brief non-blocking notifications. Use VsModal when you need user interaction or confirmation.",
12
+ "VsTabs vs VsSteps": "Use VsTabs for parallel content switching. Use VsSteps for sequential workflows or wizards.",
13
+ "VsAccordion vs VsBlock": "Use VsAccordion for collapsible sections. Use VsBlock for always-visible content sections with optional title.",
14
+ "VsHeader vs VsBar": "Use VsHeader for the main app header at the top. Use VsBar for any horizontal toolbar within a layout.",
15
+ };
16
+ function getRecommendation(nameA, nameB) {
17
+ const keyAB = `${nameA} vs ${nameB}`;
18
+ const keyBA = `${nameB} vs ${nameA}`;
19
+ return (RECOMMENDATIONS[keyAB] ??
20
+ RECOMMENDATIONS[keyBA] ??
21
+ "Both components serve similar purposes. Check props for your specific use case.");
22
+ }
23
+ function computeDifferences(a, b) {
24
+ const differences = [];
25
+ // 1. Props count difference
26
+ const propsCountA = a.props.length;
27
+ const propsCountB = b.props.length;
28
+ differences.push(`${a.name} has ${propsCountA} props, ${b.name} has ${propsCountB} props`);
29
+ // 2. Unique props
30
+ const propNamesA = new Set(a.props.map((p) => p.name));
31
+ const propNamesB = new Set(b.props.map((p) => p.name));
32
+ const uniqueToA = [...propNamesA].filter((n) => !propNamesB.has(n));
33
+ const uniqueToB = [...propNamesB].filter((n) => !propNamesA.has(n));
34
+ if (uniqueToA.length > 0) {
35
+ differences.push(`${a.name} has unique props: ${uniqueToA.join(", ")}`);
36
+ }
37
+ if (uniqueToB.length > 0) {
38
+ differences.push(`${b.name} has unique props: ${uniqueToB.join(", ")}`);
39
+ }
40
+ // 3. StyleSet variables
41
+ const varsA = Object.keys(a.styleSet.variables);
42
+ const varsB = Object.keys(b.styleSet.variables);
43
+ if (varsA.length > 0 || varsB.length > 0) {
44
+ const varSummaryA = varsA.length > 0 ? varsA.join(", ") : "(none)";
45
+ const varSummaryB = varsB.length > 0 ? varsB.join(", ") : "(none)";
46
+ differences.push(`${a.name} styleSet variables: ${varSummaryA}; ${b.name} styleSet variables: ${varSummaryB}`);
47
+ }
48
+ // 4. Child component refs
49
+ const refsA = a.styleSet.childRefs;
50
+ const refsB = b.styleSet.childRefs;
51
+ const onlyInA = refsA.filter((r) => !refsB.includes(r));
52
+ const onlyInB = refsB.filter((r) => !refsA.includes(r));
53
+ const inBoth = refsA.filter((r) => refsB.includes(r));
54
+ if (onlyInA.length > 0) {
55
+ differences.push(`${a.name} uses exclusively: ${onlyInA.join(", ")}`);
56
+ }
57
+ if (onlyInB.length > 0) {
58
+ differences.push(`${b.name} uses exclusively: ${onlyInB.join(", ")}`);
59
+ }
60
+ if (inBoth.length > 0) {
61
+ differences.push(`Both use: ${inBoth.join(", ")}`);
62
+ }
63
+ // 5. Events count (only if different)
64
+ const eventsCountA = a.events.length;
65
+ const eventsCountB = b.events.length;
66
+ if (eventsCountA !== eventsCountB) {
67
+ differences.push(`${a.name} has ${eventsCountA} events, ${b.name} has ${eventsCountB} events`);
68
+ }
69
+ return differences;
70
+ }
71
+ export function registerCompareComponents(server) {
72
+ server.tool("compare_components", "Call this when the user asks 'when should I use X vs Y', 'difference between X and Y', or 'which component should I choose'. " +
73
+ "Returns both components' full metadata plus computed differences and a usage recommendation. " +
74
+ "No follow-up tool call is needed — the response is self-contained.", {
75
+ a: z
76
+ .string()
77
+ .describe('First component name — accepts PascalCase ("VsModal") or kebab-case ("vs-modal")'),
78
+ b: z
79
+ .string()
80
+ .describe('Second component name — accepts PascalCase ("VsDrawer") or kebab-case ("vs-drawer")'),
81
+ }, async ({ a, b }) => {
82
+ const metaA = getComponentMeta(a);
83
+ if (!metaA) {
84
+ return textResponse({
85
+ error: `Component '${a}' not found. Use list_components to see available components.`,
86
+ });
87
+ }
88
+ const metaB = getComponentMeta(b);
89
+ if (!metaB) {
90
+ return textResponse({
91
+ error: `Component '${b}' not found. Use list_components to see available components.`,
92
+ });
93
+ }
94
+ if (metaA.name === metaB.name) {
95
+ return textResponse({
96
+ error: "Cannot compare a component with itself.",
97
+ });
98
+ }
99
+ const differences = computeDifferences(metaA, metaB);
100
+ const recommendation = getRecommendation(metaA.name, metaB.name);
101
+ return textResponse({
102
+ a: metaA,
103
+ b: metaB,
104
+ differences,
105
+ recommendation,
106
+ });
107
+ });
108
+ }
109
+ //# sourceMappingURL=compare-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-components.js","sourceRoot":"","sources":["../../src/tools/compare-components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGetComponentRelationships(server: McpServer): void;
3
+ //# sourceMappingURL=get-relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-relationships.d.ts","sourceRoot":"","sources":["../../src/tools/get-relationships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwBzE"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import { getComponentMeta } from "../services/meta-registry.js";
3
+ import { getRelationships } from "../services/relationships-registry.js";
4
+ import { textResponse } from "../utils/mcp-response.js";
5
+ export function registerGetComponentRelationships(server) {
6
+ server.tool("get_component_relationships", "No prerequisite needed. " +
7
+ "Call this when the user asks about component composition, which components work together, or what wraps or contains a component. " +
8
+ "Returns parent, children, and siblings relationships from curated relationship data. " +
9
+ "Then use this with get_component to understand the full composition structure before generate_component_code.", { name: z.string().describe('Component name — accepts PascalCase ("VsButton") or kebab-case ("vs-button")') }, async ({ name }) => {
10
+ const meta = getComponentMeta(name);
11
+ if (!meta) {
12
+ return textResponse({
13
+ error: `Component '${name}' not found.`,
14
+ });
15
+ }
16
+ const relationships = getRelationships(name);
17
+ return textResponse({
18
+ component: meta.name,
19
+ ...relationships,
20
+ });
21
+ });
22
+ }
23
+ //# sourceMappingURL=get-relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-relationships.js","sourceRoot":"","sources":["../../src/tools/get-relationships.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,iCAAiC,CAAC,MAAiB;IAC/D,MAAM,CAAC,IAAI,CACP,6BAA6B,EAC7B,0BAA0B;QACtB,mIAAmI;QACnI,uFAAuF;QACvF,+GAA+G,EACnH,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC,EAAE,EAC7G,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,YAAY,CAAC;gBAChB,KAAK,EAAE,cAAc,IAAI,cAAc;aAC1C,CAAC,CAAC;QACP,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO,YAAY,CAAC;YAChB,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,GAAG,aAAa;SACnB,CAAC,CAAC;IACP,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerSuggestComponents(server: McpServer): void;
3
+ //# sourceMappingURL=suggest-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-components.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuHpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgEjE"}
@@ -0,0 +1,161 @@
1
+ import { z } from "zod";
2
+ import { getAllComponentsMeta } from "../services/meta-registry.js";
3
+ import { textResponse } from "../utils/mcp-response.js";
4
+ const STOP_WORDS = new Set(["a", "an", "the", "for", "with", "and", "or", "to", "of", "in", "that", "is", "are"]);
5
+ const MAX_RESULTS = 8;
6
+ /** 키워드 → 컴포넌트 이름 매핑 */
7
+ const HEURISTIC_MAP = {
8
+ form: ["VsForm", "VsInput", "VsButton"],
9
+ login: ["VsForm", "VsInput", "VsButton"],
10
+ signup: ["VsForm", "VsInput", "VsButton"],
11
+ register: ["VsForm", "VsInput", "VsButton"],
12
+ submit: ["VsForm", "VsInput", "VsButton"],
13
+ table: ["VsTable", "VsPagination"],
14
+ list: ["VsTable", "VsPagination"],
15
+ grid: ["VsTable", "VsPagination"],
16
+ data: ["VsTable", "VsPagination"],
17
+ upload: ["VsFileDrop"],
18
+ file: ["VsFileDrop"],
19
+ drag: ["VsFileDrop"],
20
+ drop: ["VsFileDrop"],
21
+ modal: ["VsModal"],
22
+ dialog: ["VsModal"],
23
+ popup: ["VsModal"],
24
+ drawer: ["VsDrawer"],
25
+ sidebar: ["VsDrawer"],
26
+ panel: ["VsDrawer"],
27
+ toast: ["VsToast"],
28
+ notification: ["VsToast"],
29
+ alert: ["VsToast"],
30
+ loading: ["VsLoading", "VsSkeleton"],
31
+ spinner: ["VsLoading", "VsSkeleton"],
32
+ skeleton: ["VsLoading", "VsSkeleton"],
33
+ select: ["VsSelect"],
34
+ dropdown: ["VsSelect"],
35
+ choose: ["VsSelect"],
36
+ option: ["VsSelect"],
37
+ search: ["VsSearchInput"],
38
+ tab: ["VsTabs"],
39
+ tabs: ["VsTabs"],
40
+ pagination: ["VsPagination"],
41
+ page: ["VsPagination"],
42
+ paging: ["VsPagination"],
43
+ step: ["VsSteps", "VsProgress"],
44
+ wizard: ["VsSteps", "VsProgress"],
45
+ progress: ["VsSteps", "VsProgress"],
46
+ image: ["VsImage", "VsAvatar"],
47
+ photo: ["VsImage", "VsAvatar"],
48
+ avatar: ["VsImage", "VsAvatar"],
49
+ checkbox: ["VsCheckbox"],
50
+ check: ["VsCheckbox"],
51
+ multi: ["VsCheckbox"],
52
+ radio: ["VsRadio"],
53
+ switch: ["VsSwitch", "VsToggle"],
54
+ toggle: ["VsSwitch", "VsToggle"],
55
+ input: ["VsInput"],
56
+ text: ["VsInput"],
57
+ field: ["VsInput"],
58
+ textarea: ["VsTextarea"],
59
+ multiline: ["VsTextarea"],
60
+ paragraph: ["VsTextarea"],
61
+ layout: ["VsLayout", "VsHeader", "VsFooter"],
62
+ header: ["VsLayout", "VsHeader", "VsFooter"],
63
+ footer: ["VsLayout", "VsHeader", "VsFooter"],
64
+ accordion: ["VsAccordion"],
65
+ collapse: ["VsAccordion"],
66
+ expand: ["VsAccordion"],
67
+ chip: ["VsChip"],
68
+ tag: ["VsChip"],
69
+ badge: ["VsChip"],
70
+ tooltip: ["VsTooltip"],
71
+ hint: ["VsTooltip"],
72
+ help: ["VsTooltip"],
73
+ validation: ["VsForm", "VsInput", "VsMessage"],
74
+ rule: ["VsForm", "VsInput", "VsMessage"],
75
+ validate: ["VsForm", "VsInput", "VsMessage"],
76
+ password: ["VsInput", "VsForm", "VsButton"],
77
+ email: ["VsInput", "VsForm", "VsButton"],
78
+ auth: ["VsInput", "VsForm", "VsButton"],
79
+ };
80
+ function extractKeywords(useCase) {
81
+ return useCase
82
+ .toLowerCase()
83
+ .split(/[\s,./]+/)
84
+ .map((w) => w.replace(/[^a-z0-9]/g, ""))
85
+ .filter((w) => w.length > 1 && !STOP_WORDS.has(w));
86
+ }
87
+ function searchByKeyword(all, keyword) {
88
+ return all.filter((component) => {
89
+ if (component.name.toLowerCase().includes(keyword))
90
+ return true;
91
+ if (component.kebabName.toLowerCase().includes(keyword))
92
+ return true;
93
+ if (component.description.toLowerCase().includes(keyword))
94
+ return true;
95
+ return component.props.some((prop) => prop.name.toLowerCase().includes(keyword) || prop.description.toLowerCase().includes(keyword));
96
+ });
97
+ }
98
+ function buildReasoning(useCase, matchedNames, components) {
99
+ if (components.length === 0) {
100
+ return `No components matched for use case: '${useCase}'.`;
101
+ }
102
+ const nameToMeta = new Map(components.map((c) => [c.name, c]));
103
+ const descriptions = matchedNames
104
+ .map((name) => nameToMeta.get(name))
105
+ .filter((c) => c !== undefined)
106
+ .map((c) => `${c.name} (${c.description})`)
107
+ .join(", ");
108
+ return `Based on '${useCase}' use case: ${descriptions}. Call get_component for each to check props/StyleSet, then generate_component_code.`;
109
+ }
110
+ export function registerSuggestComponents(server) {
111
+ server.tool("suggest_components", "No prerequisite needed. " +
112
+ "Call this when the user describes a use case or feature to build (e.g. 'login form', 'file upload', 'data table') rather than asking about a specific component by name. " +
113
+ "Recommends relevant Vlossom components using keyword and heuristic analysis of the use case description. " +
114
+ "Then call get_component for each result to check props/StyleSet, then generate_component_code.", { useCase: z.string().describe("Description of the use case or feature to build (e.g. 'login form', 'file upload feature', 'data table with pagination')") }, async ({ useCase }) => {
115
+ const all = getAllComponentsMeta();
116
+ const keywords = extractKeywords(useCase);
117
+ const orderedNames = [];
118
+ const seen = new Set();
119
+ const addName = (name) => {
120
+ if (!seen.has(name)) {
121
+ seen.add(name);
122
+ orderedNames.push(name);
123
+ }
124
+ };
125
+ // 1단계: 휴리스틱 맵 매칭
126
+ for (const keyword of keywords) {
127
+ const heuristicMatches = HEURISTIC_MAP[keyword] ?? [];
128
+ for (const name of heuristicMatches) {
129
+ addName(name);
130
+ }
131
+ }
132
+ // 2단계: 키워드 기반 메타데이터 검색
133
+ for (const keyword of keywords) {
134
+ const searchMatches = searchByKeyword(all, keyword);
135
+ for (const component of searchMatches) {
136
+ addName(component.name);
137
+ }
138
+ }
139
+ // 3단계: 최대 8개로 제한
140
+ const limitedNames = orderedNames.slice(0, MAX_RESULTS);
141
+ // 메타데이터 조회
142
+ const nameToMeta = new Map(all.map((c) => [c.name, c]));
143
+ const components = limitedNames
144
+ .map((name) => nameToMeta.get(name))
145
+ .filter((c) => c !== undefined);
146
+ const reasoning = buildReasoning(useCase, limitedNames, components);
147
+ if (components.length === 0) {
148
+ return textResponse({
149
+ components: [],
150
+ reasoning,
151
+ message: `No components matched for use case: '${useCase}'. Try search_components with a more specific keyword.`,
152
+ });
153
+ }
154
+ return textResponse({
155
+ components,
156
+ reasoning,
157
+ total: components.length,
158
+ });
159
+ });
160
+ }
161
+ //# sourceMappingURL=suggest-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-components.js","sourceRoot":"","sources":["../../src/tools/suggest-components.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vlossom-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "MCP server for Vlossom UI component library",
5
5
  "type": "module",
6
6
  "bin": {