@kjaniec-dev/ui-mcp 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/components.json +49 -42
- package/data/tokens.json +242 -102
- package/dist/index.js +73 -50
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -18,12 +18,16 @@ try {
|
|
|
18
18
|
if (fs.existsSync(componentsJsonPath)) {
|
|
19
19
|
components = JSON.parse(fs.readFileSync(componentsJsonPath, "utf8"));
|
|
20
20
|
} else {
|
|
21
|
-
console.error(
|
|
21
|
+
console.error(
|
|
22
|
+
`Warning: components.json not found at ${componentsJsonPath}. Run 'npm run build' first.`
|
|
23
|
+
);
|
|
22
24
|
}
|
|
23
25
|
if (fs.existsSync(tokensJsonPath)) {
|
|
24
26
|
tokens = JSON.parse(fs.readFileSync(tokensJsonPath, "utf8"));
|
|
25
27
|
} else {
|
|
26
|
-
console.error(
|
|
28
|
+
console.error(
|
|
29
|
+
`Warning: tokens.json not found at ${tokensJsonPath}. Run 'npm run build' first.`
|
|
30
|
+
);
|
|
27
31
|
}
|
|
28
32
|
} catch (error) {
|
|
29
33
|
console.error("Error loading component/token metadata files:", error);
|
|
@@ -100,10 +104,12 @@ server.tool(
|
|
|
100
104
|
variants: c.cva ? Object.keys(c.cva.variants) : []
|
|
101
105
|
}));
|
|
102
106
|
return {
|
|
103
|
-
content: [
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: JSON.stringify(list, null, 2)
|
|
111
|
+
}
|
|
112
|
+
]
|
|
107
113
|
};
|
|
108
114
|
}
|
|
109
115
|
);
|
|
@@ -118,18 +124,22 @@ server.tool(
|
|
|
118
124
|
const comp = components.find((c) => c.name.toLowerCase() === cleanName);
|
|
119
125
|
if (!comp) {
|
|
120
126
|
return {
|
|
121
|
-
content: [
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
content: [
|
|
128
|
+
{
|
|
129
|
+
type: "text",
|
|
130
|
+
text: `Component "${name}" not found.`
|
|
131
|
+
}
|
|
132
|
+
]
|
|
125
133
|
};
|
|
126
134
|
}
|
|
127
135
|
const md = generateComponentMarkdown(comp);
|
|
128
136
|
return {
|
|
129
|
-
content: [
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
137
|
+
content: [
|
|
138
|
+
{
|
|
139
|
+
type: "text",
|
|
140
|
+
text: md
|
|
141
|
+
}
|
|
142
|
+
]
|
|
133
143
|
};
|
|
134
144
|
}
|
|
135
145
|
);
|
|
@@ -137,23 +147,29 @@ server.tool(
|
|
|
137
147
|
"search_components",
|
|
138
148
|
"Search the component library to find components matching keywords in names, descriptions, props, or usage snippets.",
|
|
139
149
|
{
|
|
140
|
-
query: z.string().describe(
|
|
150
|
+
query: z.string().describe(
|
|
151
|
+
"The search term or description of the use-case (e.g., 'avatar cluster', 'input with icon', 'interactive link')."
|
|
152
|
+
)
|
|
141
153
|
},
|
|
142
154
|
async ({ query }) => {
|
|
143
155
|
const q = query.toLowerCase();
|
|
144
156
|
const results = components.filter((c) => {
|
|
145
157
|
const nameMatch = c.name.toLowerCase().includes(q);
|
|
146
158
|
const descMatch = c.description.toLowerCase().includes(q);
|
|
147
|
-
const propMatch = c.props.some(
|
|
159
|
+
const propMatch = c.props.some(
|
|
160
|
+
(p) => p.name.toLowerCase().includes(q) || p.description && p.description.toLowerCase().includes(q)
|
|
161
|
+
);
|
|
148
162
|
const usageMatch = c.usageSnippet && c.usageSnippet.toLowerCase().includes(q);
|
|
149
163
|
return nameMatch || descMatch || propMatch || usageMatch;
|
|
150
164
|
});
|
|
151
165
|
if (results.length === 0) {
|
|
152
166
|
return {
|
|
153
|
-
content: [
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
167
|
+
content: [
|
|
168
|
+
{
|
|
169
|
+
type: "text",
|
|
170
|
+
text: `No components matched the query "${query}".`
|
|
171
|
+
}
|
|
172
|
+
]
|
|
157
173
|
};
|
|
158
174
|
}
|
|
159
175
|
const matchedList = results.map((c) => ({
|
|
@@ -162,10 +178,12 @@ server.tool(
|
|
|
162
178
|
importPath: c.importPath
|
|
163
179
|
}));
|
|
164
180
|
return {
|
|
165
|
-
content: [
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
181
|
+
content: [
|
|
182
|
+
{
|
|
183
|
+
type: "text",
|
|
184
|
+
text: JSON.stringify(matchedList, null, 2)
|
|
185
|
+
}
|
|
186
|
+
]
|
|
169
187
|
};
|
|
170
188
|
}
|
|
171
189
|
);
|
|
@@ -182,10 +200,12 @@ server.tool(
|
|
|
182
200
|
filteredTokens = tokens.filter((t) => t.category.startsWith(cat) || t.name.startsWith(cat));
|
|
183
201
|
}
|
|
184
202
|
return {
|
|
185
|
-
content: [
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
205
|
+
type: "text",
|
|
206
|
+
text: JSON.stringify(filteredTokens, null, 2)
|
|
207
|
+
}
|
|
208
|
+
]
|
|
189
209
|
};
|
|
190
210
|
}
|
|
191
211
|
);
|
|
@@ -205,24 +225,23 @@ server.tool(
|
|
|
205
225
|
description: "In Tailwind v4, registering these imports and the @source directive in your root CSS automatically sets up background, border-radius, shadows, and color utilities."
|
|
206
226
|
};
|
|
207
227
|
return {
|
|
208
|
-
content: [
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
228
|
+
content: [
|
|
229
|
+
{
|
|
230
|
+
type: "text",
|
|
231
|
+
text: JSON.stringify(setup, null, 2)
|
|
232
|
+
}
|
|
233
|
+
]
|
|
212
234
|
};
|
|
213
235
|
}
|
|
214
236
|
);
|
|
215
|
-
server.resource(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
{ mimeType: "application/json" },
|
|
219
|
-
async (uri) => ({
|
|
220
|
-
contents: [{
|
|
237
|
+
server.resource("tokens", "design://tokens", { mimeType: "application/json" }, async (uri) => ({
|
|
238
|
+
contents: [
|
|
239
|
+
{
|
|
221
240
|
uri: uri.href,
|
|
222
241
|
text: JSON.stringify(tokens, null, 2)
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
);
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
}));
|
|
226
245
|
server.resource(
|
|
227
246
|
"components-index",
|
|
228
247
|
"ui://components/index",
|
|
@@ -237,10 +256,12 @@ server.resource(
|
|
|
237
256
|
`;
|
|
238
257
|
}
|
|
239
258
|
return {
|
|
240
|
-
contents: [
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
259
|
+
contents: [
|
|
260
|
+
{
|
|
261
|
+
uri: uri.href,
|
|
262
|
+
text: md
|
|
263
|
+
}
|
|
264
|
+
]
|
|
244
265
|
};
|
|
245
266
|
}
|
|
246
267
|
);
|
|
@@ -256,11 +277,13 @@ server.resource(
|
|
|
256
277
|
}
|
|
257
278
|
const md = generateComponentMarkdown(comp);
|
|
258
279
|
return {
|
|
259
|
-
contents: [
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
280
|
+
contents: [
|
|
281
|
+
{
|
|
282
|
+
uri: uri.href,
|
|
283
|
+
text: md,
|
|
284
|
+
mimeType: "text/markdown"
|
|
285
|
+
}
|
|
286
|
+
]
|
|
264
287
|
};
|
|
265
288
|
}
|
|
266
289
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Data directory is located at ../data relative to dist/index.js\nconst dataDir = path.join(__dirname, \"../data\");\nconst componentsJsonPath = path.join(dataDir, \"components.json\");\nconst tokensJsonPath = path.join(dataDir, \"tokens.json\");\n\nlet components: any[] = [];\nlet tokens: any[] = [];\n\ntry {\n if (fs.existsSync(componentsJsonPath)) {\n components = JSON.parse(fs.readFileSync(componentsJsonPath, \"utf8\"));\n } else {\n console.error(`Warning: components.json not found at ${componentsJsonPath}. Run 'npm run build' first.`);\n }\n \n if (fs.existsSync(tokensJsonPath)) {\n tokens = JSON.parse(fs.readFileSync(tokensJsonPath, \"utf8\"));\n } else {\n console.error(`Warning: tokens.json not found at ${tokensJsonPath}. Run 'npm run build' first.`);\n }\n} catch (error) {\n console.error(\"Error loading component/token metadata files:\", error);\n}\n\nconst server = new McpServer({\n name: \"kj-product-kit-ui-mcp\",\n version: \"0.9.1\",\n});\n\n// Helper function to generate reference markdown for a component\nfunction generateComponentMarkdown(c: any): string {\n let md = `# ${c.name}\\n\\n`;\n md += `${c.description}\\n\\n`;\n \n md += `## Import\\n\\`\\`\\`tsx\\n${c.importPath}\\n\\`\\`\\`\\n\\n`;\n \n if (c.props && c.props.length > 0) {\n md += `## Props\\n\\n`;\n md += \"| Prop | Type | Optional | Default | Description |\\n\";\n md += \"| --- | --- | --- | --- | --- |\\n\";\n for (const p of c.props) {\n const opt = p.optional ? \"Yes\" : \"No\";\n const def = p.defaultValue !== null ? `\\`${p.defaultValue}\\`` : \"-\";\n md += `| \\`${p.name}\\` | \\`${p.type}\\` | ${opt} | ${def} | ${p.description || \"-\"} |\\n`;\n }\n md += \"\\n\";\n }\n\n if (c.cva) {\n md += `## Style Variants (CVA)\\n\\n`;\n for (const group of Object.keys(c.cva.variants)) {\n md += `### ${group}\\n`;\n md += `Options: ${c.cva.variants[group].map((v: string) => `\\`\"${v}\"\\``).join(\", \")}\\n\\n`;\n }\n \n if (Object.keys(c.cva.defaultVariants).length > 0) {\n md += `**Default Variants:**\\n`;\n for (const group of Object.keys(c.cva.defaultVariants)) {\n md += `- \\`${group}\\`: \\`\"${c.cva.defaultVariants[group]}\"\\`\\n`;\n }\n md += \"\\n\";\n }\n }\n\n if (c.usageSnippet) {\n md += `## Usage Example\\n\\`\\`\\`tsx\\n${c.usageSnippet}\\n\\`\\`\\`\\n`;\n }\n\n return md;\n}\n\n// --- TOOLS IMPLEMENTATION ---\n\n// 1. list_components\nserver.tool(\n \"list_components\",\n \"List all React components available in the UI library. Provides component names, descriptions, and variant groups.\",\n {},\n async () => {\n const list = components.map(c => ({\n name: c.name,\n description: c.description,\n variants: c.cva ? Object.keys(c.cva.variants) : []\n }));\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(list, null, 2)\n }]\n };\n }\n);\n\n// 2. get_component\nserver.tool(\n \"get_component\",\n \"Get details of a specific component including its imports, props table, style variants, and usage snippet.\",\n {\n name: z.string().describe(\"The name of the component (e.g. 'Button', 'Alert'). Case-insensitive.\")\n },\n async ({ name }) => {\n const cleanName = name.toLowerCase();\n const comp = components.find(c => c.name.toLowerCase() === cleanName);\n \n if (!comp) {\n return {\n content: [{\n type: \"text\",\n text: `Component \"${name}\" not found.`\n }]\n };\n }\n\n const md = generateComponentMarkdown(comp);\n return {\n content: [{\n type: \"text\",\n text: md\n }]\n };\n }\n);\n\n// 3. search_components\nserver.tool(\n \"search_components\",\n \"Search the component library to find components matching keywords in names, descriptions, props, or usage snippets.\",\n {\n query: z.string().describe(\"The search term or description of the use-case (e.g., 'avatar cluster', 'input with icon', 'interactive link').\")\n },\n async ({ query }) => {\n const q = query.toLowerCase();\n const results = components.filter(c => {\n const nameMatch = c.name.toLowerCase().includes(q);\n const descMatch = c.description.toLowerCase().includes(q);\n const propMatch = c.props.some((p: any) => p.name.toLowerCase().includes(q) || (p.description && p.description.toLowerCase().includes(q)));\n const usageMatch = c.usageSnippet && c.usageSnippet.toLowerCase().includes(q);\n return nameMatch || descMatch || propMatch || usageMatch;\n });\n\n if (results.length === 0) {\n return {\n content: [{\n type: \"text\",\n text: `No components matched the query \"${query}\".`\n }]\n };\n }\n\n const matchedList = results.map(c => ({\n name: c.name,\n description: c.description,\n importPath: c.importPath\n }));\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(matchedList, null, 2)\n }]\n };\n }\n);\n\n// 4. get_tokens\nserver.tool(\n \"get_tokens\",\n \"Get the design tokens filtered optionally by category (e.g. 'color', 'radius', 'shadow', 'font'). Returns light/dark values and Tailwind utility mapping.\",\n {\n category: z.string().optional().describe(\"Optional token category filter, e.g. 'color', 'radius', 'shadow', 'font'.\")\n },\n async ({ category }) => {\n let filteredTokens = tokens;\n if (category) {\n const cat = category.toLowerCase();\n filteredTokens = tokens.filter(t => t.category.startsWith(cat) || t.name.startsWith(cat));\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(filteredTokens, null, 2)\n }]\n };\n }\n);\n\n// 5. get_setup\nserver.tool(\n \"get_setup\",\n \"Get setup details for the design kit, including npm installation instructions and CSS import order.\",\n {},\n async () => {\n const setup = {\n installCommand: \"npm install @kjaniec-dev/ui @kjaniec-dev/design\",\n requiredImports: [\n `@import \"tailwindcss\"; /* imports Tailwind CSS v4 */`,\n `@source \"../node_modules/@kjaniec-dev/ui\"; /* instructs Tailwind v4 to scan UI kit components for utility classes */`,\n `@import \"@kjaniec-dev/design/tailwind.css\"; /* registers all --kj-* tokens as Tailwind utilities */`,\n `@import \"@kjaniec-dev/ui/ui.css\"; /* imports component-specific layouts and styles */`\n ],\n description: \"In Tailwind v4, registering these imports and the @source directive in your root CSS automatically sets up background, border-radius, shadows, and color utilities.\"\n };\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(setup, null, 2)\n }]\n };\n }\n);\n\n// --- RESOURCES IMPLEMENTATION ---\n\n// 1. Raw tokens.json\nserver.resource(\n \"tokens\",\n \"design://tokens\",\n { mimeType: \"application/json\" },\n async (uri) => ({\n contents: [{\n uri: uri.href,\n text: JSON.stringify(tokens, null, 2)\n }]\n })\n);\n\n// 2. Generated components index (markdown)\nserver.resource(\n \"components-index\",\n \"ui://components/index\",\n { mimeType: \"text/markdown\" },\n async (uri) => {\n let md = \"# Component Index\\n\\n\";\n md += \"A complete index of all exported UI components available in the `@kjaniec-dev/ui` library.\\n\\n\";\n md += \"| Component | Import Statement | Description |\\n\";\n md += \"| --- | --- | --- |\\n\";\n for (const c of components) {\n md += `| **[${c.name}](ui://component/${c.name.toLowerCase()})** | \\`${c.importPath}\\` | ${c.description} |\\n`;\n }\n return {\n contents: [{\n uri: uri.href,\n text: md\n }]\n };\n }\n);\n\n// 3. Dynamic per-component reference docs (markdown)\nserver.resource(\n \"component-docs\",\n new ResourceTemplate(\"ui://component/{name}\", { list: undefined }),\n async (uri, { name }) => {\n const nameStr = Array.isArray(name) ? name[0] : name;\n const cleanName = nameStr.toLowerCase();\n const comp = components.find(c => c.name.toLowerCase() === cleanName);\n \n if (!comp) {\n throw new Error(`Component \"${nameStr}\" not found.`);\n }\n\n const md = generateComponentMarkdown(comp);\n return {\n contents: [{\n uri: uri.href,\n text: md,\n mimeType: \"text/markdown\"\n }]\n };\n }\n);\n\nasync function run() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"KJ UI MCP server running on stdio transport.\");\n}\n\nrun().catch((error) => {\n console.error(\"Fatal error starting MCP server:\", error);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Data directory is located at ../data relative to dist/index.js\nconst dataDir = path.join(__dirname, \"../data\");\nconst componentsJsonPath = path.join(dataDir, \"components.json\");\nconst tokensJsonPath = path.join(dataDir, \"tokens.json\");\n\nlet components: any[] = [];\nlet tokens: any[] = [];\n\ntry {\n if (fs.existsSync(componentsJsonPath)) {\n components = JSON.parse(fs.readFileSync(componentsJsonPath, \"utf8\"));\n } else {\n console.error(\n `Warning: components.json not found at ${componentsJsonPath}. Run 'npm run build' first.`\n );\n }\n\n if (fs.existsSync(tokensJsonPath)) {\n tokens = JSON.parse(fs.readFileSync(tokensJsonPath, \"utf8\"));\n } else {\n console.error(\n `Warning: tokens.json not found at ${tokensJsonPath}. Run 'npm run build' first.`\n );\n }\n} catch (error) {\n console.error(\"Error loading component/token metadata files:\", error);\n}\n\nconst server = new McpServer({\n name: \"kj-product-kit-ui-mcp\",\n version: \"0.9.1\",\n});\n\n// Helper function to generate reference markdown for a component\nfunction generateComponentMarkdown(c: any): string {\n let md = `# ${c.name}\\n\\n`;\n md += `${c.description}\\n\\n`;\n\n md += `## Import\\n\\`\\`\\`tsx\\n${c.importPath}\\n\\`\\`\\`\\n\\n`;\n\n if (c.props && c.props.length > 0) {\n md += `## Props\\n\\n`;\n md += \"| Prop | Type | Optional | Default | Description |\\n\";\n md += \"| --- | --- | --- | --- | --- |\\n\";\n for (const p of c.props) {\n const opt = p.optional ? \"Yes\" : \"No\";\n const def = p.defaultValue !== null ? `\\`${p.defaultValue}\\`` : \"-\";\n md += `| \\`${p.name}\\` | \\`${p.type}\\` | ${opt} | ${def} | ${p.description || \"-\"} |\\n`;\n }\n md += \"\\n\";\n }\n\n if (c.cva) {\n md += `## Style Variants (CVA)\\n\\n`;\n for (const group of Object.keys(c.cva.variants)) {\n md += `### ${group}\\n`;\n md += `Options: ${c.cva.variants[group].map((v: string) => `\\`\"${v}\"\\``).join(\", \")}\\n\\n`;\n }\n\n if (Object.keys(c.cva.defaultVariants).length > 0) {\n md += `**Default Variants:**\\n`;\n for (const group of Object.keys(c.cva.defaultVariants)) {\n md += `- \\`${group}\\`: \\`\"${c.cva.defaultVariants[group]}\"\\`\\n`;\n }\n md += \"\\n\";\n }\n }\n\n if (c.usageSnippet) {\n md += `## Usage Example\\n\\`\\`\\`tsx\\n${c.usageSnippet}\\n\\`\\`\\`\\n`;\n }\n\n return md;\n}\n\n// --- TOOLS IMPLEMENTATION ---\n\n// 1. list_components\nserver.tool(\n \"list_components\",\n \"List all React components available in the UI library. Provides component names, descriptions, and variant groups.\",\n {},\n async () => {\n const list = components.map((c) => ({\n name: c.name,\n description: c.description,\n variants: c.cva ? Object.keys(c.cva.variants) : [],\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(list, null, 2),\n },\n ],\n };\n }\n);\n\n// 2. get_component\nserver.tool(\n \"get_component\",\n \"Get details of a specific component including its imports, props table, style variants, and usage snippet.\",\n {\n name: z\n .string()\n .describe(\"The name of the component (e.g. 'Button', 'Alert'). Case-insensitive.\"),\n },\n async ({ name }) => {\n const cleanName = name.toLowerCase();\n const comp = components.find((c) => c.name.toLowerCase() === cleanName);\n\n if (!comp) {\n return {\n content: [\n {\n type: \"text\",\n text: `Component \"${name}\" not found.`,\n },\n ],\n };\n }\n\n const md = generateComponentMarkdown(comp);\n return {\n content: [\n {\n type: \"text\",\n text: md,\n },\n ],\n };\n }\n);\n\n// 3. search_components\nserver.tool(\n \"search_components\",\n \"Search the component library to find components matching keywords in names, descriptions, props, or usage snippets.\",\n {\n query: z\n .string()\n .describe(\n \"The search term or description of the use-case (e.g., 'avatar cluster', 'input with icon', 'interactive link').\"\n ),\n },\n async ({ query }) => {\n const q = query.toLowerCase();\n const results = components.filter((c) => {\n const nameMatch = c.name.toLowerCase().includes(q);\n const descMatch = c.description.toLowerCase().includes(q);\n const propMatch = c.props.some(\n (p: any) =>\n p.name.toLowerCase().includes(q) ||\n (p.description && p.description.toLowerCase().includes(q))\n );\n const usageMatch = c.usageSnippet && c.usageSnippet.toLowerCase().includes(q);\n return nameMatch || descMatch || propMatch || usageMatch;\n });\n\n if (results.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: `No components matched the query \"${query}\".`,\n },\n ],\n };\n }\n\n const matchedList = results.map((c) => ({\n name: c.name,\n description: c.description,\n importPath: c.importPath,\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(matchedList, null, 2),\n },\n ],\n };\n }\n);\n\n// 4. get_tokens\nserver.tool(\n \"get_tokens\",\n \"Get the design tokens filtered optionally by category (e.g. 'color', 'radius', 'shadow', 'font'). Returns light/dark values and Tailwind utility mapping.\",\n {\n category: z\n .string()\n .optional()\n .describe(\"Optional token category filter, e.g. 'color', 'radius', 'shadow', 'font'.\"),\n },\n async ({ category }) => {\n let filteredTokens = tokens;\n if (category) {\n const cat = category.toLowerCase();\n filteredTokens = tokens.filter((t) => t.category.startsWith(cat) || t.name.startsWith(cat));\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(filteredTokens, null, 2),\n },\n ],\n };\n }\n);\n\n// 5. get_setup\nserver.tool(\n \"get_setup\",\n \"Get setup details for the design kit, including npm installation instructions and CSS import order.\",\n {},\n async () => {\n const setup = {\n installCommand: \"npm install @kjaniec-dev/ui @kjaniec-dev/design\",\n requiredImports: [\n `@import \"tailwindcss\"; /* imports Tailwind CSS v4 */`,\n `@source \"../node_modules/@kjaniec-dev/ui\"; /* instructs Tailwind v4 to scan UI kit components for utility classes */`,\n `@import \"@kjaniec-dev/design/tailwind.css\"; /* registers all --kj-* tokens as Tailwind utilities */`,\n `@import \"@kjaniec-dev/ui/ui.css\"; /* imports component-specific layouts and styles */`,\n ],\n description:\n \"In Tailwind v4, registering these imports and the @source directive in your root CSS automatically sets up background, border-radius, shadows, and color utilities.\",\n };\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(setup, null, 2),\n },\n ],\n };\n }\n);\n\n// --- RESOURCES IMPLEMENTATION ---\n\n// 1. Raw tokens.json\nserver.resource(\"tokens\", \"design://tokens\", { mimeType: \"application/json\" }, async (uri) => ({\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(tokens, null, 2),\n },\n ],\n}));\n\n// 2. Generated components index (markdown)\nserver.resource(\n \"components-index\",\n \"ui://components/index\",\n { mimeType: \"text/markdown\" },\n async (uri) => {\n let md = \"# Component Index\\n\\n\";\n md +=\n \"A complete index of all exported UI components available in the `@kjaniec-dev/ui` library.\\n\\n\";\n md += \"| Component | Import Statement | Description |\\n\";\n md += \"| --- | --- | --- |\\n\";\n for (const c of components) {\n md += `| **[${c.name}](ui://component/${c.name.toLowerCase()})** | \\`${c.importPath}\\` | ${c.description} |\\n`;\n }\n return {\n contents: [\n {\n uri: uri.href,\n text: md,\n },\n ],\n };\n }\n);\n\n// 3. Dynamic per-component reference docs (markdown)\nserver.resource(\n \"component-docs\",\n new ResourceTemplate(\"ui://component/{name}\", { list: undefined }),\n async (uri, { name }) => {\n const nameStr = Array.isArray(name) ? name[0] : name;\n const cleanName = nameStr.toLowerCase();\n const comp = components.find((c) => c.name.toLowerCase() === cleanName);\n\n if (!comp) {\n throw new Error(`Component \"${nameStr}\" not found.`);\n }\n\n const md = generateComponentMarkdown(comp);\n return {\n contents: [\n {\n uri: uri.href,\n text: md,\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n);\n\nasync function run() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"KJ UI MCP server running on stdio transport.\");\n}\n\nrun().catch((error) => {\n console.error(\"Fatal error starting MCP server:\", error);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kjaniec-dev/ui-mcp",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server for KJ Product Kit design system and UI components",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "kjaniec-dev",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"dev": "tsup --watch",
|
|
28
28
|
"clean": "rm -rf dist",
|
|
29
29
|
"typecheck": "tsc --noEmit",
|
|
30
|
-
"lint": "
|
|
30
|
+
"lint": "biome lint .",
|
|
31
31
|
"test": "vitest run",
|
|
32
32
|
"prepublishOnly": "npm run clean && npm run build && npm run test"
|
|
33
33
|
},
|