@kjaniec-dev/ui-mcp 0.9.0 → 0.9.2

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.
@@ -1884,7 +1884,7 @@
1884
1884
  }
1885
1885
  ],
1886
1886
  "cva": null,
1887
- "usageSnippet": "<SettingsLayout\n title=\"Profile Settings\"\n description=\"Customize how your profile appears to other members.\"\n sidebar={\n <div className=\"flex flex-row lg:flex-col gap-1 w-full\">\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start bg-primary/10 text-primary\">General</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Team</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Billing</Button>\n </div>\n }\n>\n <Card className=\"p-6 space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <TextField label=\"First Name\" defaultValue=\"John\" />\n <TextField label=\"Last Name\" defaultValue=\"Doe\" />\n </div>\n <TextField label=\"Email Address\" defaultValue=\"john.doe@gmail.com\" />\n <div className=\"flex justify-end pt-2\">\n <Button size=\"sm\">Save profile</Button>\n </div>\n </Card>\n</SettingsLayout>"
1887
+ "usageSnippet": "<SettingsLayout\n title=\"Profile Settings\"\n description=\"Customize how your profile appears to other members.\"\n sidebar={\n <div className=\"flex flex-row lg:flex-col gap-1 w-full\">\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start bg-primary/10 text-primary\">General</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Team</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start text-muted-foreground\">Billing</Button>\n </div>\n }\n>\n <Card className=\"p-6 space-y-4\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <TextField label=\"First Name\" defaultValue=\"John\" />\n <TextField label=\"Last Name\" defaultValue=\"Doe\" />\n </div>\n <TextField label=\"Email Address\" defaultValue=\"john.doe@gmail.com\" />\n <div className=\"flex justify-end pt-2\">\n <Button size=\"sm\">Save profile</Button>\n </div>\n </Card>\n</SettingsLayout>"
1888
1888
  },
1889
1889
  {
1890
1890
  "name": "DetailPageLayout",
@@ -2856,6 +2856,13 @@
2856
2856
  "defaultValue": null,
2857
2857
  "description": ""
2858
2858
  },
2859
+ {
2860
+ "name": "singleMonth",
2861
+ "type": "boolean",
2862
+ "optional": true,
2863
+ "defaultValue": null,
2864
+ "description": "Force rendering 1 month instead of 2 side-by-side."
2865
+ },
2859
2866
  {
2860
2867
  "name": "className",
2861
2868
  "type": "string",
@@ -3386,6 +3393,13 @@
3386
3393
  "defaultValue": "\"horizontal\"",
3387
3394
  "description": ""
3388
3395
  },
3396
+ {
3397
+ "name": "responsive",
3398
+ "type": "boolean",
3399
+ "optional": true,
3400
+ "defaultValue": "true",
3401
+ "description": ""
3402
+ },
3389
3403
  {
3390
3404
  "name": "linear",
3391
3405
  "type": "boolean",
@@ -3551,6 +3565,13 @@
3551
3565
  "optional": true,
3552
3566
  "defaultValue": null,
3553
3567
  "description": ""
3568
+ },
3569
+ {
3570
+ "name": "bottomNav",
3571
+ "type": "React.ReactNode",
3572
+ "optional": true,
3573
+ "defaultValue": null,
3574
+ "description": ""
3554
3575
  }
3555
3576
  ],
3556
3577
  "cva": null,
@@ -4123,6 +4144,13 @@
4123
4144
  "defaultValue": null,
4124
4145
  "description": ""
4125
4146
  },
4147
+ {
4148
+ "name": "align",
4149
+ "type": "\"auto\" | \"start\" | \"end\"",
4150
+ "optional": true,
4151
+ "defaultValue": "\"auto\"",
4152
+ "description": ""
4153
+ },
4126
4154
  {
4127
4155
  "name": "width",
4128
4156
  "type": "number | string",
@@ -4375,5 +4403,261 @@
4375
4403
  ],
4376
4404
  "cva": null,
4377
4405
  "usageSnippet": "<ImageGallery images={sampleImages.slice(0, 4)} columns={2} />"
4406
+ },
4407
+ {
4408
+ "name": "InPostGeowidget",
4409
+ "importPath": "import { InPostGeowidget } from \"@kjaniec-dev/ui\";",
4410
+ "description": "React component InPostGeowidget.",
4411
+ "props": [
4412
+ {
4413
+ "name": "value",
4414
+ "type": "InPostPoint | string | null",
4415
+ "optional": true,
4416
+ "defaultValue": null,
4417
+ "description": "Currently selected point object or point code string (e.g. 'WAW01M')."
4418
+ },
4419
+ {
4420
+ "name": "onSelect",
4421
+ "type": "(point: InPostPoint) => void",
4422
+ "optional": true,
4423
+ "defaultValue": null,
4424
+ "description": "Callback triggered when point is selected on the map."
4425
+ },
4426
+ {
4427
+ "name": "triggerText",
4428
+ "type": "string",
4429
+ "optional": true,
4430
+ "defaultValue": "'Wybierz Paczkomat®'",
4431
+ "description": "Trigger button label. Default 'Wybierz Paczkomat®'."
4432
+ },
4433
+ {
4434
+ "name": "modalTitle",
4435
+ "type": "string",
4436
+ "optional": true,
4437
+ "defaultValue": "'Wybierz punkt odbioru InPost'",
4438
+ "description": "Modal header title. Default 'Wybierz punkt odbioru InPost'."
4439
+ },
4440
+ {
4441
+ "name": "disabled",
4442
+ "type": "boolean",
4443
+ "optional": true,
4444
+ "defaultValue": "false",
4445
+ "description": "Disable trigger button. Default false."
4446
+ },
4447
+ {
4448
+ "name": "open",
4449
+ "type": "boolean",
4450
+ "optional": true,
4451
+ "defaultValue": null,
4452
+ "description": "Controlled open state of the modal."
4453
+ },
4454
+ {
4455
+ "name": "onOpenChange",
4456
+ "type": "(open: boolean) => void",
4457
+ "optional": true,
4458
+ "defaultValue": null,
4459
+ "description": "Callback when open state changes."
4460
+ },
4461
+ {
4462
+ "name": "showSelectedBadge",
4463
+ "type": "boolean",
4464
+ "optional": true,
4465
+ "defaultValue": "true",
4466
+ "description": "Show selected point badge under trigger button. Default true."
4467
+ },
4468
+ {
4469
+ "name": "className",
4470
+ "type": "string",
4471
+ "optional": true,
4472
+ "defaultValue": "''",
4473
+ "description": "Outer container CSS class name."
4474
+ },
4475
+ {
4476
+ "name": "buttonVariant",
4477
+ "type": "'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'",
4478
+ "optional": true,
4479
+ "defaultValue": "'outline'",
4480
+ "description": "Trigger button style variant ('primary', 'secondary', 'outline', 'ghost', 'danger'). Default 'outline'."
4481
+ },
4482
+ {
4483
+ "name": "buttonSize",
4484
+ "type": "'sm' | 'md' | 'lg'",
4485
+ "optional": true,
4486
+ "defaultValue": "'md'",
4487
+ "description": "Trigger button size ('sm', 'md', 'lg'). Default 'md'."
4488
+ },
4489
+ {
4490
+ "name": "token",
4491
+ "type": "string",
4492
+ "optional": true,
4493
+ "defaultValue": null,
4494
+ "description": "InPost API Token (optional for sandbox)."
4495
+ },
4496
+ {
4497
+ "name": "language",
4498
+ "type": "InPostLanguage",
4499
+ "optional": true,
4500
+ "defaultValue": null,
4501
+ "description": "Widget language ('pl', 'en', 'uk', 'de', 'it', 'fr'). Default 'pl'."
4502
+ },
4503
+ {
4504
+ "name": "config",
4505
+ "type": "InPostConfigType",
4506
+ "optional": true,
4507
+ "defaultValue": null,
4508
+ "description": "Widget configuration type ('parcelCollect', 'parcelCollectPayment', 'international', 'postBuy'). Default 'parcelCollect'."
4509
+ },
4510
+ {
4511
+ "name": "sandbox",
4512
+ "type": "boolean",
4513
+ "optional": true,
4514
+ "defaultValue": null,
4515
+ "description": "Enable sandbox environment. Default false."
4516
+ },
4517
+ {
4518
+ "name": "customScriptUrl",
4519
+ "type": "string",
4520
+ "optional": true,
4521
+ "defaultValue": null,
4522
+ "description": "Custom SDK JavaScript URL."
4523
+ },
4524
+ {
4525
+ "name": "customCssUrl",
4526
+ "type": "string",
4527
+ "optional": true,
4528
+ "defaultValue": null,
4529
+ "description": "Custom SDK CSS URL."
4530
+ }
4531
+ ],
4532
+ "cva": null,
4533
+ "usageSnippet": "<InPostGeowidget\n sandbox={true}\n onPointSelect={(point) => setSelectedPoint(point)}\n/>"
4534
+ },
4535
+ {
4536
+ "name": "InPostGeowidgetModal",
4537
+ "importPath": "import { InPostGeowidgetModal } from \"@kjaniec-dev/ui\";",
4538
+ "description": "React component InPostGeowidgetModal.",
4539
+ "props": [
4540
+ {
4541
+ "name": "value",
4542
+ "type": "InPostPoint | string | null",
4543
+ "optional": true,
4544
+ "defaultValue": null,
4545
+ "description": "Currently selected point object or point code string (e.g. 'WAW01M')."
4546
+ },
4547
+ {
4548
+ "name": "onSelect",
4549
+ "type": "(point: InPostPoint) => void",
4550
+ "optional": true,
4551
+ "defaultValue": null,
4552
+ "description": "Callback triggered when point is selected on the map."
4553
+ },
4554
+ {
4555
+ "name": "triggerText",
4556
+ "type": "string",
4557
+ "optional": true,
4558
+ "defaultValue": "'Wybierz Paczkomat®'",
4559
+ "description": "Trigger button label. Default 'Wybierz Paczkomat®'."
4560
+ },
4561
+ {
4562
+ "name": "modalTitle",
4563
+ "type": "string",
4564
+ "optional": true,
4565
+ "defaultValue": "'Wybierz punkt odbioru InPost'",
4566
+ "description": "Modal header title. Default 'Wybierz punkt odbioru InPost'."
4567
+ },
4568
+ {
4569
+ "name": "disabled",
4570
+ "type": "boolean",
4571
+ "optional": true,
4572
+ "defaultValue": "false",
4573
+ "description": "Disable trigger button. Default false."
4574
+ },
4575
+ {
4576
+ "name": "open",
4577
+ "type": "boolean",
4578
+ "optional": true,
4579
+ "defaultValue": null,
4580
+ "description": "Controlled open state of the modal."
4581
+ },
4582
+ {
4583
+ "name": "onOpenChange",
4584
+ "type": "(open: boolean) => void",
4585
+ "optional": true,
4586
+ "defaultValue": null,
4587
+ "description": "Callback when open state changes."
4588
+ },
4589
+ {
4590
+ "name": "showSelectedBadge",
4591
+ "type": "boolean",
4592
+ "optional": true,
4593
+ "defaultValue": "true",
4594
+ "description": "Show selected point badge under trigger button. Default true."
4595
+ },
4596
+ {
4597
+ "name": "className",
4598
+ "type": "string",
4599
+ "optional": true,
4600
+ "defaultValue": "''",
4601
+ "description": "Outer container CSS class name."
4602
+ },
4603
+ {
4604
+ "name": "buttonVariant",
4605
+ "type": "'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'",
4606
+ "optional": true,
4607
+ "defaultValue": "'outline'",
4608
+ "description": "Trigger button style variant ('primary', 'secondary', 'outline', 'ghost', 'danger'). Default 'outline'."
4609
+ },
4610
+ {
4611
+ "name": "buttonSize",
4612
+ "type": "'sm' | 'md' | 'lg'",
4613
+ "optional": true,
4614
+ "defaultValue": "'md'",
4615
+ "description": "Trigger button size ('sm', 'md', 'lg'). Default 'md'."
4616
+ },
4617
+ {
4618
+ "name": "token",
4619
+ "type": "string",
4620
+ "optional": true,
4621
+ "defaultValue": null,
4622
+ "description": "InPost API Token (optional for sandbox)."
4623
+ },
4624
+ {
4625
+ "name": "language",
4626
+ "type": "InPostLanguage",
4627
+ "optional": true,
4628
+ "defaultValue": null,
4629
+ "description": "Widget language ('pl', 'en', 'uk', 'de', 'it', 'fr'). Default 'pl'."
4630
+ },
4631
+ {
4632
+ "name": "config",
4633
+ "type": "InPostConfigType",
4634
+ "optional": true,
4635
+ "defaultValue": null,
4636
+ "description": "Widget configuration type ('parcelCollect', 'parcelCollectPayment', 'international', 'postBuy'). Default 'parcelCollect'."
4637
+ },
4638
+ {
4639
+ "name": "sandbox",
4640
+ "type": "boolean",
4641
+ "optional": true,
4642
+ "defaultValue": null,
4643
+ "description": "Enable sandbox environment. Default false."
4644
+ },
4645
+ {
4646
+ "name": "customScriptUrl",
4647
+ "type": "string",
4648
+ "optional": true,
4649
+ "defaultValue": null,
4650
+ "description": "Custom SDK JavaScript URL."
4651
+ },
4652
+ {
4653
+ "name": "customCssUrl",
4654
+ "type": "string",
4655
+ "optional": true,
4656
+ "defaultValue": null,
4657
+ "description": "Custom SDK CSS URL."
4658
+ }
4659
+ ],
4660
+ "cva": null,
4661
+ "usageSnippet": "<InPostGeowidgetModal\n sandbox={true}\n value={point}\n onSelect={(p) => setPoint(p)}\n/>"
4378
4662
  }
4379
4663
  ]
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ try {
30
30
  }
31
31
  var server = new McpServer({
32
32
  name: "kj-product-kit-ui-mcp",
33
- version: "0.4.0"
33
+ version: "0.9.1"
34
34
  });
35
35
  function generateComponentMarkdown(c) {
36
36
  let md = `# ${c.name}
@@ -197,10 +197,12 @@ server.tool(
197
197
  const setup = {
198
198
  installCommand: "npm install @kjaniec-dev/ui @kjaniec-dev/design",
199
199
  requiredImports: [
200
+ `@import "tailwindcss"; /* imports Tailwind CSS v4 */`,
201
+ `@source "../node_modules/@kjaniec-dev/ui"; /* instructs Tailwind v4 to scan UI kit components for utility classes */`,
200
202
  `@import "@kjaniec-dev/design/tailwind.css"; /* registers all --kj-* tokens as Tailwind utilities */`,
201
203
  `@import "@kjaniec-dev/ui/ui.css"; /* imports component-specific layouts and styles */`
202
204
  ],
203
- description: "In Tailwind v4, registering these imports in your root CSS automatically sets up background, border-radius, shadows, and color utilities."
205
+ 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."
204
206
  };
205
207
  return {
206
208
  content: [{
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.4.0\",\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 \"@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 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(`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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kjaniec-dev/ui-mcp",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
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",