@waiframe/mcp-server 0.1.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/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/api-client.d.ts +27 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +66 -0
- package/dist/api-client.js.map +1 -0
- package/dist/data/component-catalog.d.ts +16 -0
- package/dist/data/component-catalog.d.ts.map +1 -0
- package/dist/data/component-catalog.js +101 -0
- package/dist/data/component-catalog.js.map +1 -0
- package/dist/data/design-patterns.d.ts +17 -0
- package/dist/data/design-patterns.d.ts.map +1 -0
- package/dist/data/design-patterns.js +43 -0
- package/dist/data/design-patterns.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/component-catalog.d.ts +3 -0
- package/dist/resources/component-catalog.d.ts.map +1 -0
- package/dist/resources/component-catalog.js +16 -0
- package/dist/resources/component-catalog.js.map +1 -0
- package/dist/resources/design-patterns.d.ts +3 -0
- package/dist/resources/design-patterns.d.ts.map +1 -0
- package/dist/resources/design-patterns.js +16 -0
- package/dist/resources/design-patterns.js.map +1 -0
- package/dist/tools/component-spec.d.ts +3 -0
- package/dist/tools/component-spec.d.ts.map +1 -0
- package/dist/tools/component-spec.js +33 -0
- package/dist/tools/component-spec.js.map +1 -0
- package/dist/tools/context.d.ts +4 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +34 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/flows.d.ts +4 -0
- package/dist/tools/flows.d.ts.map +1 -0
- package/dist/tools/flows.js +43 -0
- package/dist/tools/flows.js.map +1 -0
- package/dist/tools/projects.d.ts +4 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +41 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/screens.d.ts +4 -0
- package/dist/tools/screens.d.ts.map +1 -0
- package/dist/tools/screens.js +59 -0
- package/dist/tools/screens.js.map +1 -0
- package/dist/transform/semantic.d.ts +15 -0
- package/dist/transform/semantic.d.ts.map +1 -0
- package/dist/transform/semantic.js +87 -0
- package/dist/transform/semantic.js.map +1 -0
- package/dist/types.d.ts +129 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getComponentByType, COMPONENT_CATALOG } from "../data/component-catalog.js";
|
|
3
|
+
export function registerComponentSpecTools(server) {
|
|
4
|
+
server.tool("get_component_spec", "Get the specification for a Waiframe wireframe component (props, description, category)", {
|
|
5
|
+
componentType: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe("The component type (e.g. 'button-primary', 'text-input', 'sidebar')"),
|
|
8
|
+
}, async ({ componentType }) => {
|
|
9
|
+
const component = getComponentByType(componentType);
|
|
10
|
+
if (!component) {
|
|
11
|
+
const types = COMPONENT_CATALOG.map((c) => c.type).join(", ");
|
|
12
|
+
return {
|
|
13
|
+
content: [
|
|
14
|
+
{
|
|
15
|
+
type: "text",
|
|
16
|
+
text: `Component "${componentType}" not found.\n\nAvailable types: ${types}`,
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const propsStr = Object.entries(component.props)
|
|
22
|
+
.map(([k, v]) => ` - ${k}: ${v}`)
|
|
23
|
+
.join("\n");
|
|
24
|
+
const text = `# Component: ${component.type}
|
|
25
|
+
Category: ${component.category}
|
|
26
|
+
${component.description}
|
|
27
|
+
|
|
28
|
+
## Properties
|
|
29
|
+
${propsStr}`;
|
|
30
|
+
return { content: [{ type: "text", text }] };
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=component-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-spec.js","sourceRoot":"","sources":["../../src/tools/component-spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAErF,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,yFAAyF,EACzF;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,CAAC,qEAAqE,CAAC;KACnF,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QAC1B,MAAM,SAAS,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,cAAc,aAAa,oCAAoC,KAAK,EAAE;qBAC7E;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;aAC7C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,gBAAgB,SAAS,CAAC,IAAI;YACrC,SAAS,CAAC,QAAQ;EAC5B,SAAS,CAAC,WAAW;;;EAGrB,QAAQ,EAAE,CAAC;QAEP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,QAuChF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerContextTools(server, client) {
|
|
3
|
+
server.tool("get_design_context", "Get the app context and design intent for a project (app type, audience, features, brand style)", { projectId: z.string().describe("The project UUID") }, async ({ projectId }) => {
|
|
4
|
+
const data = await client.getContext(projectId);
|
|
5
|
+
if (!data.context) {
|
|
6
|
+
return {
|
|
7
|
+
content: [
|
|
8
|
+
{
|
|
9
|
+
type: "text",
|
|
10
|
+
text: `# ${data.project.name}\n\nPlatform: ${data.project.platform} (${data.project.dimensions.width}x${data.project.dimensions.height})\n${data.project.description || ""}\n\nNo additional design context has been set for this project.`,
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const ctx = data.context;
|
|
16
|
+
const lines = [
|
|
17
|
+
`# Design Context: ${data.project.name}`,
|
|
18
|
+
"",
|
|
19
|
+
`Platform: ${data.project.platform} (${data.project.dimensions.width}x${data.project.dimensions.height})`,
|
|
20
|
+
data.project.description ? `Description: ${data.project.description}` : "",
|
|
21
|
+
"",
|
|
22
|
+
"## App Details",
|
|
23
|
+
ctx.appType ? `- App Type: ${ctx.appType}` : "",
|
|
24
|
+
ctx.audience ? `- Target Audience: ${ctx.audience}` : "",
|
|
25
|
+
ctx.brandStyle ? `- Brand Style: ${ctx.brandStyle}` : "",
|
|
26
|
+
ctx.features && ctx.features.length > 0
|
|
27
|
+
? `- Key Features: ${ctx.features.join(", ")}`
|
|
28
|
+
: "",
|
|
29
|
+
ctx.additionalContext ? `\n## Additional Context\n${ctx.additionalContext}` : "",
|
|
30
|
+
].filter(Boolean);
|
|
31
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAyB;IAC/E,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,iGAAiG,EACjG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EACtD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,iBAAiB,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,iEAAiE;qBAC5O;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,MAAM,KAAK,GAAG;YACZ,qBAAqB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACxC,EAAE;YACF,aAAa,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG;YACzG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;YAC1E,EAAE;YACF,gBAAgB;YAChB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;YAC/C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;YACxD,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;YACxD,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,mBAAmB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC9C,CAAC,CAAC,EAAE;YACN,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,4BAA4B,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE;SACjF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAElB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flows.d.ts","sourceRoot":"","sources":["../../src/tools/flows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,QAoD7E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerFlowTools(server, client) {
|
|
3
|
+
server.tool("get_flow", "Get a user flow showing screen navigation sequence with named screens (no UUIDs)", {
|
|
4
|
+
projectId: z.string().describe("The project UUID"),
|
|
5
|
+
flowName: z.string().describe("The flow name (use get_project_overview to see names)"),
|
|
6
|
+
}, async ({ projectId, flowName }) => {
|
|
7
|
+
const flows = await client.getFlows(projectId);
|
|
8
|
+
const target = flows.find((f) => f.name.toLowerCase() === flowName.toLowerCase());
|
|
9
|
+
if (!target) {
|
|
10
|
+
const available = flows.map((f) => f.name).join(", ");
|
|
11
|
+
return {
|
|
12
|
+
content: [
|
|
13
|
+
{
|
|
14
|
+
type: "text",
|
|
15
|
+
text: `Flow "${flowName}" not found. Available flows: ${available || "(none)"}`,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const screenNames = target.nodes
|
|
21
|
+
.map((n) => n.screenName || n.screenId)
|
|
22
|
+
.join(" → ");
|
|
23
|
+
const edgeList = target.edges
|
|
24
|
+
.map((e) => {
|
|
25
|
+
const sourceNode = target.nodes.find((n) => n.screenId === e.source);
|
|
26
|
+
const targetNode = target.nodes.find((n) => n.screenId === e.target);
|
|
27
|
+
const sourceName = sourceNode?.screenName || e.source;
|
|
28
|
+
const targetName = targetNode?.screenName || e.target;
|
|
29
|
+
return ` ${sourceName} → ${targetName}${e.label ? ` (${e.label})` : ""}`;
|
|
30
|
+
})
|
|
31
|
+
.join("\n");
|
|
32
|
+
const text = `# Flow: ${target.name}
|
|
33
|
+
${target.description || ""}
|
|
34
|
+
|
|
35
|
+
Entry: ${target.entryScreenName || target.entryScreen}
|
|
36
|
+
Sequence: ${screenNames}
|
|
37
|
+
|
|
38
|
+
## Transitions
|
|
39
|
+
${edgeList || " (no transitions defined)"}`;
|
|
40
|
+
return { content: [{ type: "text", text }] };
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=flows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flows.js","sourceRoot":"","sources":["../../src/tools/flows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAyB;IAC5E,MAAM,CAAC,IAAI,CACT,UAAU,EACV,kFAAkF,EAClF;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KACvF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CACvD,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,QAAQ,iCAAiC,SAAS,IAAI,QAAQ,EAAE;qBAChF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK;aAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC;aACtC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,UAAU,EAAE,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC;YACtD,MAAM,UAAU,GAAG,UAAU,EAAE,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC;YACtD,OAAO,KAAK,UAAU,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5E,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,WAAW,MAAM,CAAC,IAAI;EACvC,MAAM,CAAC,WAAW,IAAI,EAAE;;SAEjB,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,WAAW;YACzC,WAAW;;;EAGrB,QAAQ,IAAI,4BAA4B,EAAE,CAAC;QAEvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,QA4DhF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerProjectTools(server, client) {
|
|
3
|
+
server.tool("list_projects", "List all your Waiframe wireframe projects with screen and flow counts", {}, async () => {
|
|
4
|
+
const projects = await client.listProjects();
|
|
5
|
+
if (projects.length === 0) {
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text: "No wireframe projects found. Create one at waiframe.ai" }],
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const text = projects
|
|
11
|
+
.map((p) => `- ${p.name} (${p.platform}): ${p.screenCount} screens, ${p.flowCount} flows [id: ${p.id}]`)
|
|
12
|
+
.join("\n");
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: `# Your Wireframe Projects\n\n${text}` }],
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
server.tool("get_project_overview", "Get a wireframe project overview including all screen names and flow names", { projectId: z.string().describe("The project UUID") }, async ({ projectId }) => {
|
|
18
|
+
const detail = await client.getProjectOverview(projectId);
|
|
19
|
+
const screenList = detail.screens
|
|
20
|
+
.map((s) => ` - ${s.name} (${s.screenType}) [id: ${s.id}]`)
|
|
21
|
+
.join("\n");
|
|
22
|
+
const flowList = detail.flows.length > 0
|
|
23
|
+
? detail.flows.map((f) => ` - ${f.name}${f.description ? `: ${f.description}` : ""} [id: ${f.id}]`).join("\n")
|
|
24
|
+
: " (no flows defined)";
|
|
25
|
+
const contextStr = detail.project.aiContext
|
|
26
|
+
? `\n## App Context\n- Type: ${detail.project.aiContext.appType || "N/A"}\n- Audience: ${detail.project.aiContext.audience || "N/A"}\n- Style: ${detail.project.aiContext.brandStyle || "N/A"}\n- Features: ${detail.project.aiContext.features?.join(", ") || "N/A"}`
|
|
27
|
+
: "";
|
|
28
|
+
const text = `# ${detail.project.name}
|
|
29
|
+
${detail.project.description || ""}
|
|
30
|
+
|
|
31
|
+
Platform: ${detail.project.platform} (${detail.project.dimensions.width}x${detail.project.dimensions.height})
|
|
32
|
+
|
|
33
|
+
## Screens (${detail.screens.length})
|
|
34
|
+
${screenList}
|
|
35
|
+
|
|
36
|
+
## Flows (${detail.flows.length})
|
|
37
|
+
${flowList}${contextStr}`;
|
|
38
|
+
return { content: [{ type: "text", text }] };
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/tools/screens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,QAyC/E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { transformScreen, buildScreenNameMap } from "../transform/semantic.js";
|
|
3
|
+
export function registerScreenTools(server, client) {
|
|
4
|
+
server.tool("get_screen", "Get a wireframe screen in semantic format (AI-friendly: component types, props, navigation targets — no UUIDs or positions)", {
|
|
5
|
+
projectId: z.string().describe("The project UUID"),
|
|
6
|
+
screenName: z.string().describe("The screen name (use get_project_overview to see names)"),
|
|
7
|
+
}, async ({ projectId, screenName }) => {
|
|
8
|
+
// Fetch all screens to build name map for connection resolution
|
|
9
|
+
const screens = await client.getScreens(projectId);
|
|
10
|
+
const target = screens.find((s) => s.name.toLowerCase() === screenName.toLowerCase());
|
|
11
|
+
if (!target) {
|
|
12
|
+
const available = screens.map((s) => s.name).join(", ");
|
|
13
|
+
return {
|
|
14
|
+
content: [
|
|
15
|
+
{
|
|
16
|
+
type: "text",
|
|
17
|
+
text: `Screen "${screenName}" not found. Available screens: ${available}`,
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const screenNameMap = buildScreenNameMap(screens);
|
|
23
|
+
const semantic = transformScreen(target, screenNameMap);
|
|
24
|
+
const elementsYaml = formatSemanticElements(semantic.elements, 0);
|
|
25
|
+
const text = `# Screen: ${semantic.name}
|
|
26
|
+
Type: ${semantic.type}
|
|
27
|
+
|
|
28
|
+
## Elements (top to bottom)
|
|
29
|
+
${elementsYaml}`;
|
|
30
|
+
return { content: [{ type: "text", text }] };
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function formatSemanticElements(elements, indent) {
|
|
34
|
+
const prefix = " ".repeat(indent);
|
|
35
|
+
return elements
|
|
36
|
+
.map((el) => {
|
|
37
|
+
const propsStr = Object.entries(el.props)
|
|
38
|
+
.filter(([, v]) => v !== undefined && v !== null && v !== "")
|
|
39
|
+
.map(([k, v]) => {
|
|
40
|
+
if (Array.isArray(v))
|
|
41
|
+
return `${k}: [${v.map((i) => `"${i}"`).join(", ")}]`;
|
|
42
|
+
if (typeof v === "string")
|
|
43
|
+
return `${k}: "${v}"`;
|
|
44
|
+
return `${k}: ${v}`;
|
|
45
|
+
})
|
|
46
|
+
.join(", ");
|
|
47
|
+
let line = `${prefix}- ${el.component}`;
|
|
48
|
+
if (propsStr)
|
|
49
|
+
line += ` {${propsStr}}`;
|
|
50
|
+
if (el.navigates_to)
|
|
51
|
+
line += ` → ${el.navigates_to}`;
|
|
52
|
+
if (el.children && el.children.length > 0) {
|
|
53
|
+
line += "\n" + formatSemanticElements(el.children, indent + 1);
|
|
54
|
+
}
|
|
55
|
+
return line;
|
|
56
|
+
})
|
|
57
|
+
.join("\n");
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=screens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/tools/screens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Screen, SemanticScreen } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Build a map of screenId -> screenName for resolving connections.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildScreenNameMap(screens: Screen[]): Map<string, string>;
|
|
6
|
+
/**
|
|
7
|
+
* Transform a raw screen into a semantic representation.
|
|
8
|
+
* Elements are sorted by Y-position (top to bottom reading order).
|
|
9
|
+
*/
|
|
10
|
+
export declare function transformScreen(screen: Screen, screenNameMap: Map<string, string>): SemanticScreen;
|
|
11
|
+
/**
|
|
12
|
+
* Transform all screens in a project into semantic format.
|
|
13
|
+
*/
|
|
14
|
+
export declare function transformAllScreens(screens: Screen[]): SemanticScreen[];
|
|
15
|
+
//# sourceMappingURL=semantic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/transform/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiD,cAAc,EAAE,MAAM,aAAa,CAAC;AAYzG;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzE;AA4DD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,cAAc,CAahB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAGvE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Properties to strip from elements (not useful for AI code generation).
|
|
3
|
+
*/
|
|
4
|
+
const STRIP_PROPS = new Set(["locked", "hidden", "zIndex"]);
|
|
5
|
+
/**
|
|
6
|
+
* Properties to always exclude from the semantic output.
|
|
7
|
+
*/
|
|
8
|
+
const EXCLUDE_ELEMENT_FIELDS = new Set(["id", "position", "size", "locked", "hidden", "zIndex"]);
|
|
9
|
+
/**
|
|
10
|
+
* Build a map of screenId -> screenName for resolving connections.
|
|
11
|
+
*/
|
|
12
|
+
export function buildScreenNameMap(screens) {
|
|
13
|
+
return new Map(screens.map((s) => [s.id, s.name]));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Transform a raw element into a semantic representation.
|
|
17
|
+
* Strips UUIDs, positions, sizes. Keeps component type and relevant props.
|
|
18
|
+
*/
|
|
19
|
+
function transformElement(element, connections, screenNameMap) {
|
|
20
|
+
// Clean properties — remove empty/null values
|
|
21
|
+
const props = {};
|
|
22
|
+
for (const [key, value] of Object.entries(element.properties || {})) {
|
|
23
|
+
if (STRIP_PROPS.has(key))
|
|
24
|
+
continue;
|
|
25
|
+
if (value === null || value === undefined || value === "")
|
|
26
|
+
continue;
|
|
27
|
+
props[key] = value;
|
|
28
|
+
}
|
|
29
|
+
const result = {
|
|
30
|
+
component: element.type,
|
|
31
|
+
props,
|
|
32
|
+
};
|
|
33
|
+
// Resolve navigation connections for this element
|
|
34
|
+
const elementConnections = connections.filter((c) => c.fromElement === element.id);
|
|
35
|
+
for (const conn of elementConnections) {
|
|
36
|
+
if (conn.action.toScreen) {
|
|
37
|
+
const screenName = screenNameMap.get(conn.action.toScreen);
|
|
38
|
+
if (screenName) {
|
|
39
|
+
// If connection has an itemIndex, note which item triggers navigation
|
|
40
|
+
if (conn.itemIndex !== undefined) {
|
|
41
|
+
const items = element.properties?.items;
|
|
42
|
+
const itemLabel = items?.[conn.itemIndex];
|
|
43
|
+
result.navigates_to = `${screenName}${itemLabel ? ` (from "${itemLabel}")` : ` (item ${conn.itemIndex})`}`;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
result.navigates_to = screenName;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (conn.action.modalId) {
|
|
51
|
+
const modalName = screenNameMap.get(conn.action.modalId);
|
|
52
|
+
if (modalName)
|
|
53
|
+
result.navigates_to = `${modalName} (modal)`;
|
|
54
|
+
}
|
|
55
|
+
if (conn.action.drawerId) {
|
|
56
|
+
const drawerName = screenNameMap.get(conn.action.drawerId);
|
|
57
|
+
if (drawerName)
|
|
58
|
+
result.navigates_to = `${drawerName} (drawer)`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Transform children recursively
|
|
62
|
+
if (element.children && element.children.length > 0) {
|
|
63
|
+
result.children = element.children.map((child) => transformElement(child, connections, screenNameMap));
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Transform a raw screen into a semantic representation.
|
|
69
|
+
* Elements are sorted by Y-position (top to bottom reading order).
|
|
70
|
+
*/
|
|
71
|
+
export function transformScreen(screen, screenNameMap) {
|
|
72
|
+
// Sort elements by Y position (top to bottom)
|
|
73
|
+
const sortedElements = [...screen.elements].sort((a, b) => (a.position?.y || 0) - (b.position?.y || 0));
|
|
74
|
+
return {
|
|
75
|
+
name: screen.name,
|
|
76
|
+
type: screen.screenType,
|
|
77
|
+
elements: sortedElements.map((el) => transformElement(el, screen.connections, screenNameMap)),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Transform all screens in a project into semantic format.
|
|
82
|
+
*/
|
|
83
|
+
export function transformAllScreens(screens) {
|
|
84
|
+
const screenNameMap = buildScreenNameMap(screens);
|
|
85
|
+
return screens.map((s) => transformScreen(s, screenNameMap));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/transform/semantic.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained types for the MCP server package.
|
|
3
|
+
* No workspace dependencies — this package must be independently publishable.
|
|
4
|
+
*/
|
|
5
|
+
export type Platform = "mobile" | "desktop" | "tablet";
|
|
6
|
+
export interface Dimensions {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Position {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
}
|
|
14
|
+
export interface Size {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
18
|
+
export interface WireframeElement {
|
|
19
|
+
id: string;
|
|
20
|
+
type: string;
|
|
21
|
+
position: Position;
|
|
22
|
+
size: Size;
|
|
23
|
+
properties: Record<string, unknown>;
|
|
24
|
+
locked?: boolean;
|
|
25
|
+
hidden?: boolean;
|
|
26
|
+
zIndex?: number;
|
|
27
|
+
children?: WireframeElement[];
|
|
28
|
+
}
|
|
29
|
+
export interface Connection {
|
|
30
|
+
id: string;
|
|
31
|
+
fromElement: string;
|
|
32
|
+
trigger: string;
|
|
33
|
+
action: {
|
|
34
|
+
type: string;
|
|
35
|
+
toScreen?: string;
|
|
36
|
+
modalId?: string;
|
|
37
|
+
drawerId?: string;
|
|
38
|
+
transition?: string;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
};
|
|
41
|
+
itemIndex?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface Screen {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
screenType: string;
|
|
47
|
+
order: number;
|
|
48
|
+
elements: WireframeElement[];
|
|
49
|
+
connections: Connection[];
|
|
50
|
+
canvasWidth?: number | null;
|
|
51
|
+
canvasHeight?: number | null;
|
|
52
|
+
}
|
|
53
|
+
export interface FlowNode {
|
|
54
|
+
screenId: string;
|
|
55
|
+
screenName?: string | null;
|
|
56
|
+
[key: string]: unknown;
|
|
57
|
+
}
|
|
58
|
+
export interface FlowEdge {
|
|
59
|
+
id: string;
|
|
60
|
+
source: string;
|
|
61
|
+
target: string;
|
|
62
|
+
label?: string;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
export interface Flow {
|
|
66
|
+
id: string;
|
|
67
|
+
name: string;
|
|
68
|
+
description?: string | null;
|
|
69
|
+
entryScreen: string;
|
|
70
|
+
entryScreenName?: string | null;
|
|
71
|
+
nodes: FlowNode[];
|
|
72
|
+
edges: FlowEdge[];
|
|
73
|
+
color?: string;
|
|
74
|
+
createdAt: string;
|
|
75
|
+
}
|
|
76
|
+
export interface ProjectOverview {
|
|
77
|
+
id: string;
|
|
78
|
+
name: string;
|
|
79
|
+
description?: string | null;
|
|
80
|
+
platform: Platform;
|
|
81
|
+
dimensions: Dimensions;
|
|
82
|
+
createdAt: string;
|
|
83
|
+
updatedAt: string;
|
|
84
|
+
screenCount: number;
|
|
85
|
+
flowCount: number;
|
|
86
|
+
}
|
|
87
|
+
export interface ProjectDetail {
|
|
88
|
+
project: {
|
|
89
|
+
id: string;
|
|
90
|
+
name: string;
|
|
91
|
+
description?: string | null;
|
|
92
|
+
platform: Platform;
|
|
93
|
+
dimensions: Dimensions;
|
|
94
|
+
aiContext?: ProjectContext | null;
|
|
95
|
+
createdAt: string;
|
|
96
|
+
updatedAt: string;
|
|
97
|
+
};
|
|
98
|
+
screens: Array<{
|
|
99
|
+
id: string;
|
|
100
|
+
name: string;
|
|
101
|
+
screenType: string;
|
|
102
|
+
order: number;
|
|
103
|
+
}>;
|
|
104
|
+
flows: Array<{
|
|
105
|
+
id: string;
|
|
106
|
+
name: string;
|
|
107
|
+
description?: string | null;
|
|
108
|
+
}>;
|
|
109
|
+
}
|
|
110
|
+
export interface ProjectContext {
|
|
111
|
+
appType?: string;
|
|
112
|
+
audience?: string;
|
|
113
|
+
features?: string[];
|
|
114
|
+
brandStyle?: string;
|
|
115
|
+
additionalContext?: string;
|
|
116
|
+
[key: string]: unknown;
|
|
117
|
+
}
|
|
118
|
+
export interface SemanticElement {
|
|
119
|
+
component: string;
|
|
120
|
+
props: Record<string, unknown>;
|
|
121
|
+
navigates_to?: string;
|
|
122
|
+
children?: SemanticElement[];
|
|
123
|
+
}
|
|
124
|
+
export interface SemanticScreen {
|
|
125
|
+
name: string;
|
|
126
|
+
type: string;
|
|
127
|
+
elements: SemanticElement[];
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,QAAQ,EAAE,QAAQ,CAAC;QACnB,UAAU,EAAE,UAAU,CAAC;QACvB,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@waiframe/mcp-server",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "MCP server for Waiframe.ai — connect AI coding tools to your wireframe designs",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"waiframe-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
22
|
+
"zod": "^3.23.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^22.0.0",
|
|
26
|
+
"typescript": "^5.7.0"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/waiframe/waiframe-mcp-server"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"mcp",
|
|
37
|
+
"wireframe",
|
|
38
|
+
"ai",
|
|
39
|
+
"design",
|
|
40
|
+
"model-context-protocol",
|
|
41
|
+
"claude",
|
|
42
|
+
"cursor"
|
|
43
|
+
]
|
|
44
|
+
}
|