@kjaniec-dev/ui-mcp 0.9.2 → 1.0.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.
package/dist/index.js CHANGED
@@ -18,19 +18,23 @@ try {
18
18
  if (fs.existsSync(componentsJsonPath)) {
19
19
  components = JSON.parse(fs.readFileSync(componentsJsonPath, "utf8"));
20
20
  } else {
21
- console.error(`Warning: components.json not found at ${componentsJsonPath}. Run 'npm run build' first.`);
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(`Warning: tokens.json not found at ${tokensJsonPath}. Run 'npm run build' first.`);
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);
30
34
  }
31
35
  var server = new McpServer({
32
36
  name: "kj-product-kit-ui-mcp",
33
- version: "0.9.1"
37
+ version: "1.0.0"
34
38
  });
35
39
  function generateComponentMarkdown(c) {
36
40
  let md = `# ${c.name}
@@ -100,10 +104,12 @@ server.tool(
100
104
  variants: c.cva ? Object.keys(c.cva.variants) : []
101
105
  }));
102
106
  return {
103
- content: [{
104
- type: "text",
105
- text: JSON.stringify(list, null, 2)
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
- type: "text",
123
- text: `Component "${name}" not found.`
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
- type: "text",
131
- text: md
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("The search term or description of the use-case (e.g., 'avatar cluster', 'input with icon', 'interactive link').")
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((p) => p.name.toLowerCase().includes(q) || p.description && p.description.toLowerCase().includes(q));
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
- type: "text",
155
- text: `No components matched the query "${query}".`
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
- type: "text",
167
- text: JSON.stringify(matchedList, null, 2)
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
- type: "text",
187
- text: JSON.stringify(filteredTokens, null, 2)
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
- type: "text",
210
- text: JSON.stringify(setup, null, 2)
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
- "tokens",
217
- "design://tokens",
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
- uri: uri.href,
242
- text: md
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
- uri: uri.href,
261
- text: md,
262
- mimeType: "text/markdown"
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\";\nimport type { ComponentInfo, ParsedToken, PropInfo } from \"./extractor.js\";\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: ComponentInfo[] = [];\nlet tokens: ParsedToken[] = [];\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: \"1.0.0\",\n});\n\n// Helper function to generate reference markdown for a component\nfunction generateComponentMarkdown(c: ComponentInfo): 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: PropInfo) =>\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.2",
3
+ "version": "1.0.0",
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": "eslint .",
30
+ "lint": "biome lint .",
31
31
  "test": "vitest run",
32
32
  "prepublishOnly": "npm run clean && npm run build && npm run test"
33
33
  },