@kjaniec-dev/ui-mcp 0.4.1
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/README.md +71 -0
- package/data/components.json +1101 -0
- package/data/tokens.json +898 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +274 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
var __dirname = path.dirname(__filename);
|
|
12
|
+
var dataDir = path.join(__dirname, "../data");
|
|
13
|
+
var componentsJsonPath = path.join(dataDir, "components.json");
|
|
14
|
+
var tokensJsonPath = path.join(dataDir, "tokens.json");
|
|
15
|
+
var components = [];
|
|
16
|
+
var tokens = [];
|
|
17
|
+
try {
|
|
18
|
+
if (fs.existsSync(componentsJsonPath)) {
|
|
19
|
+
components = JSON.parse(fs.readFileSync(componentsJsonPath, "utf8"));
|
|
20
|
+
} else {
|
|
21
|
+
console.error(`Warning: components.json not found at ${componentsJsonPath}. Run 'npm run build' first.`);
|
|
22
|
+
}
|
|
23
|
+
if (fs.existsSync(tokensJsonPath)) {
|
|
24
|
+
tokens = JSON.parse(fs.readFileSync(tokensJsonPath, "utf8"));
|
|
25
|
+
} else {
|
|
26
|
+
console.error(`Warning: tokens.json not found at ${tokensJsonPath}. Run 'npm run build' first.`);
|
|
27
|
+
}
|
|
28
|
+
} catch (error) {
|
|
29
|
+
console.error("Error loading component/token metadata files:", error);
|
|
30
|
+
}
|
|
31
|
+
var server = new McpServer({
|
|
32
|
+
name: "kj-product-kit-ui-mcp",
|
|
33
|
+
version: "0.4.0"
|
|
34
|
+
});
|
|
35
|
+
function generateComponentMarkdown(c) {
|
|
36
|
+
let md = `# ${c.name}
|
|
37
|
+
|
|
38
|
+
`;
|
|
39
|
+
md += `${c.description}
|
|
40
|
+
|
|
41
|
+
`;
|
|
42
|
+
md += `## Import
|
|
43
|
+
\`\`\`tsx
|
|
44
|
+
${c.importPath}
|
|
45
|
+
\`\`\`
|
|
46
|
+
|
|
47
|
+
`;
|
|
48
|
+
if (c.props && c.props.length > 0) {
|
|
49
|
+
md += `## Props
|
|
50
|
+
|
|
51
|
+
`;
|
|
52
|
+
md += "| Prop | Type | Optional | Default | Description |\n";
|
|
53
|
+
md += "| --- | --- | --- | --- | --- |\n";
|
|
54
|
+
for (const p of c.props) {
|
|
55
|
+
const opt = p.optional ? "Yes" : "No";
|
|
56
|
+
const def = p.defaultValue !== null ? `\`${p.defaultValue}\`` : "-";
|
|
57
|
+
md += `| \`${p.name}\` | \`${p.type}\` | ${opt} | ${def} | ${p.description || "-"} |
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
md += "\n";
|
|
61
|
+
}
|
|
62
|
+
if (c.cva) {
|
|
63
|
+
md += `## Style Variants (CVA)
|
|
64
|
+
|
|
65
|
+
`;
|
|
66
|
+
for (const group of Object.keys(c.cva.variants)) {
|
|
67
|
+
md += `### ${group}
|
|
68
|
+
`;
|
|
69
|
+
md += `Options: ${c.cva.variants[group].map((v) => `\`"${v}"\``).join(", ")}
|
|
70
|
+
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
if (Object.keys(c.cva.defaultVariants).length > 0) {
|
|
74
|
+
md += `**Default Variants:**
|
|
75
|
+
`;
|
|
76
|
+
for (const group of Object.keys(c.cva.defaultVariants)) {
|
|
77
|
+
md += `- \`${group}\`: \`"${c.cva.defaultVariants[group]}"\`
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
md += "\n";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (c.usageSnippet) {
|
|
84
|
+
md += `## Usage Example
|
|
85
|
+
\`\`\`tsx
|
|
86
|
+
${c.usageSnippet}
|
|
87
|
+
\`\`\`
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
90
|
+
return md;
|
|
91
|
+
}
|
|
92
|
+
server.tool(
|
|
93
|
+
"list_components",
|
|
94
|
+
"List all React components available in the UI library. Provides component names, descriptions, and variant groups.",
|
|
95
|
+
{},
|
|
96
|
+
async () => {
|
|
97
|
+
const list = components.map((c) => ({
|
|
98
|
+
name: c.name,
|
|
99
|
+
description: c.description,
|
|
100
|
+
variants: c.cva ? Object.keys(c.cva.variants) : []
|
|
101
|
+
}));
|
|
102
|
+
return {
|
|
103
|
+
content: [{
|
|
104
|
+
type: "text",
|
|
105
|
+
text: JSON.stringify(list, null, 2)
|
|
106
|
+
}]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
server.tool(
|
|
111
|
+
"get_component",
|
|
112
|
+
"Get details of a specific component including its imports, props table, style variants, and usage snippet.",
|
|
113
|
+
{
|
|
114
|
+
name: z.string().describe("The name of the component (e.g. 'Button', 'Alert'). Case-insensitive.")
|
|
115
|
+
},
|
|
116
|
+
async ({ name }) => {
|
|
117
|
+
const cleanName = name.toLowerCase();
|
|
118
|
+
const comp = components.find((c) => c.name.toLowerCase() === cleanName);
|
|
119
|
+
if (!comp) {
|
|
120
|
+
return {
|
|
121
|
+
content: [{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: `Component "${name}" not found.`
|
|
124
|
+
}]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const md = generateComponentMarkdown(comp);
|
|
128
|
+
return {
|
|
129
|
+
content: [{
|
|
130
|
+
type: "text",
|
|
131
|
+
text: md
|
|
132
|
+
}]
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
server.tool(
|
|
137
|
+
"search_components",
|
|
138
|
+
"Search the component library to find components matching keywords in names, descriptions, props, or usage snippets.",
|
|
139
|
+
{
|
|
140
|
+
query: z.string().describe("The search term or description of the use-case (e.g., 'avatar cluster', 'input with icon', 'interactive link').")
|
|
141
|
+
},
|
|
142
|
+
async ({ query }) => {
|
|
143
|
+
const q = query.toLowerCase();
|
|
144
|
+
const results = components.filter((c) => {
|
|
145
|
+
const nameMatch = c.name.toLowerCase().includes(q);
|
|
146
|
+
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));
|
|
148
|
+
const usageMatch = c.usageSnippet && c.usageSnippet.toLowerCase().includes(q);
|
|
149
|
+
return nameMatch || descMatch || propMatch || usageMatch;
|
|
150
|
+
});
|
|
151
|
+
if (results.length === 0) {
|
|
152
|
+
return {
|
|
153
|
+
content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: `No components matched the query "${query}".`
|
|
156
|
+
}]
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const matchedList = results.map((c) => ({
|
|
160
|
+
name: c.name,
|
|
161
|
+
description: c.description,
|
|
162
|
+
importPath: c.importPath
|
|
163
|
+
}));
|
|
164
|
+
return {
|
|
165
|
+
content: [{
|
|
166
|
+
type: "text",
|
|
167
|
+
text: JSON.stringify(matchedList, null, 2)
|
|
168
|
+
}]
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
server.tool(
|
|
173
|
+
"get_tokens",
|
|
174
|
+
"Get the design tokens filtered optionally by category (e.g. 'color', 'radius', 'shadow', 'font'). Returns light/dark values and Tailwind utility mapping.",
|
|
175
|
+
{
|
|
176
|
+
category: z.string().optional().describe("Optional token category filter, e.g. 'color', 'radius', 'shadow', 'font'.")
|
|
177
|
+
},
|
|
178
|
+
async ({ category }) => {
|
|
179
|
+
let filteredTokens = tokens;
|
|
180
|
+
if (category) {
|
|
181
|
+
const cat = category.toLowerCase();
|
|
182
|
+
filteredTokens = tokens.filter((t) => t.category.startsWith(cat) || t.name.startsWith(cat));
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
content: [{
|
|
186
|
+
type: "text",
|
|
187
|
+
text: JSON.stringify(filteredTokens, null, 2)
|
|
188
|
+
}]
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
server.tool(
|
|
193
|
+
"get_setup",
|
|
194
|
+
"Get setup details for the design kit, including npm installation instructions and CSS import order.",
|
|
195
|
+
{},
|
|
196
|
+
async () => {
|
|
197
|
+
const setup = {
|
|
198
|
+
installCommand: "npm install @kjaniec-dev/ui @kjaniec-dev/design",
|
|
199
|
+
requiredImports: [
|
|
200
|
+
`@import "@kjaniec-dev/design/tailwind.css"; /* registers all --kj-* tokens as Tailwind utilities */`,
|
|
201
|
+
`@import "@kjaniec-dev/ui/ui.css"; /* imports component-specific layouts and styles */`
|
|
202
|
+
],
|
|
203
|
+
description: "In Tailwind v4, registering these imports in your root CSS automatically sets up background, border-radius, shadows, and color utilities."
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
content: [{
|
|
207
|
+
type: "text",
|
|
208
|
+
text: JSON.stringify(setup, null, 2)
|
|
209
|
+
}]
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
server.resource(
|
|
214
|
+
"tokens",
|
|
215
|
+
"design://tokens",
|
|
216
|
+
{ mimeType: "application/json" },
|
|
217
|
+
async (uri) => ({
|
|
218
|
+
contents: [{
|
|
219
|
+
uri: uri.href,
|
|
220
|
+
text: JSON.stringify(tokens, null, 2)
|
|
221
|
+
}]
|
|
222
|
+
})
|
|
223
|
+
);
|
|
224
|
+
server.resource(
|
|
225
|
+
"components-index",
|
|
226
|
+
"ui://components/index",
|
|
227
|
+
{ mimeType: "text/markdown" },
|
|
228
|
+
async (uri) => {
|
|
229
|
+
let md = "# Component Index\n\n";
|
|
230
|
+
md += "A complete index of all exported UI components available in the `@kjaniec-dev/ui` library.\n\n";
|
|
231
|
+
md += "| Component | Import Statement | Description |\n";
|
|
232
|
+
md += "| --- | --- | --- |\n";
|
|
233
|
+
for (const c of components) {
|
|
234
|
+
md += `| **[${c.name}](ui://component/${c.name.toLowerCase()})** | \`${c.importPath}\` | ${c.description} |
|
|
235
|
+
`;
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
contents: [{
|
|
239
|
+
uri: uri.href,
|
|
240
|
+
text: md
|
|
241
|
+
}]
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
server.resource(
|
|
246
|
+
"component-docs",
|
|
247
|
+
new ResourceTemplate("ui://component/{name}", { list: void 0 }),
|
|
248
|
+
async (uri, { name }) => {
|
|
249
|
+
const nameStr = Array.isArray(name) ? name[0] : name;
|
|
250
|
+
const cleanName = nameStr.toLowerCase();
|
|
251
|
+
const comp = components.find((c) => c.name.toLowerCase() === cleanName);
|
|
252
|
+
if (!comp) {
|
|
253
|
+
throw new Error(`Component "${nameStr}" not found.`);
|
|
254
|
+
}
|
|
255
|
+
const md = generateComponentMarkdown(comp);
|
|
256
|
+
return {
|
|
257
|
+
contents: [{
|
|
258
|
+
uri: uri.href,
|
|
259
|
+
text: md,
|
|
260
|
+
mimeType: "text/markdown"
|
|
261
|
+
}]
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
);
|
|
265
|
+
async function run() {
|
|
266
|
+
const transport = new StdioServerTransport();
|
|
267
|
+
await server.connect(transport);
|
|
268
|
+
console.error("KJ UI MCP server running on stdio transport.");
|
|
269
|
+
}
|
|
270
|
+
run().catch((error) => {
|
|
271
|
+
console.error("Fatal error starting MCP server:", error);
|
|
272
|
+
process.exit(1);
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kjaniec-dev/ui-mcp",
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "MCP (Model Context Protocol) server for KJ Product Kit design system and UI components",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "kjaniec-dev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/kjaniec-dev/ui-kit.git",
|
|
10
|
+
"directory": "packages/mcp"
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"bin": {
|
|
15
|
+
"ui-mcp": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"data",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"clean": "rm -rf dist",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"test": "tsx src/run-test.ts",
|
|
31
|
+
"prepublishOnly": "npm run clean && npm run build && npm run test"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.0.1",
|
|
35
|
+
"zod": "^3.23.8"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^25.9.1",
|
|
39
|
+
"tsup": "^8.3.0",
|
|
40
|
+
"tsx": "^4.19.1",
|
|
41
|
+
"typescript": "^5.5.0"
|
|
42
|
+
}
|
|
43
|
+
}
|