@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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/api-client.d.ts +27 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +66 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/data/component-catalog.d.ts +16 -0
  8. package/dist/data/component-catalog.d.ts.map +1 -0
  9. package/dist/data/component-catalog.js +101 -0
  10. package/dist/data/component-catalog.js.map +1 -0
  11. package/dist/data/design-patterns.d.ts +17 -0
  12. package/dist/data/design-patterns.d.ts.map +1 -0
  13. package/dist/data/design-patterns.js +43 -0
  14. package/dist/data/design-patterns.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +36 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/resources/component-catalog.d.ts +3 -0
  20. package/dist/resources/component-catalog.d.ts.map +1 -0
  21. package/dist/resources/component-catalog.js +16 -0
  22. package/dist/resources/component-catalog.js.map +1 -0
  23. package/dist/resources/design-patterns.d.ts +3 -0
  24. package/dist/resources/design-patterns.d.ts.map +1 -0
  25. package/dist/resources/design-patterns.js +16 -0
  26. package/dist/resources/design-patterns.js.map +1 -0
  27. package/dist/tools/component-spec.d.ts +3 -0
  28. package/dist/tools/component-spec.d.ts.map +1 -0
  29. package/dist/tools/component-spec.js +33 -0
  30. package/dist/tools/component-spec.js.map +1 -0
  31. package/dist/tools/context.d.ts +4 -0
  32. package/dist/tools/context.d.ts.map +1 -0
  33. package/dist/tools/context.js +34 -0
  34. package/dist/tools/context.js.map +1 -0
  35. package/dist/tools/flows.d.ts +4 -0
  36. package/dist/tools/flows.d.ts.map +1 -0
  37. package/dist/tools/flows.js +43 -0
  38. package/dist/tools/flows.js.map +1 -0
  39. package/dist/tools/projects.d.ts +4 -0
  40. package/dist/tools/projects.d.ts.map +1 -0
  41. package/dist/tools/projects.js +41 -0
  42. package/dist/tools/projects.js.map +1 -0
  43. package/dist/tools/screens.d.ts +4 -0
  44. package/dist/tools/screens.d.ts.map +1 -0
  45. package/dist/tools/screens.js +59 -0
  46. package/dist/tools/screens.js.map +1 -0
  47. package/dist/transform/semantic.d.ts +15 -0
  48. package/dist/transform/semantic.d.ts.map +1 -0
  49. package/dist/transform/semantic.js +87 -0
  50. package/dist/transform/semantic.js.map +1 -0
  51. package/dist/types.d.ts +129 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +6 -0
  54. package/dist/types.js.map +1 -0
  55. 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,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WaiframeApiClient } from "../api-client.js";
3
+ export declare function registerContextTools(server: McpServer, client: WaiframeApiClient): void;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -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,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WaiframeApiClient } from "../api-client.js";
3
+ export declare function registerFlowTools(server: McpServer, client: WaiframeApiClient): void;
4
+ //# sourceMappingURL=flows.d.ts.map
@@ -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,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WaiframeApiClient } from "../api-client.js";
3
+ export declare function registerProjectTools(server: McpServer, client: WaiframeApiClient): void;
4
+ //# sourceMappingURL=projects.d.ts.map
@@ -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,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WaiframeApiClient } from "../api-client.js";
3
+ export declare function registerScreenTools(server: McpServer, client: WaiframeApiClient): void;
4
+ //# sourceMappingURL=screens.d.ts.map
@@ -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":"AAEA;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEjG;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAiB;IAClD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CACvB,OAAyB,EACzB,WAAyB,EACzB,aAAkC;IAElC,8CAA8C;IAC9C,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QACpE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAoB;QAC9B,SAAS,EAAE,OAAO,CAAC,IAAI;QACvB,KAAK;KACN,CAAC;IAEF,kDAAkD;IAClD,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,UAAU,EAAE,CAAC;gBACf,sEAAsE;gBACtE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,KAA6B,CAAC;oBAChE,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1C,MAAM,CAAC,YAAY,GAAG,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;gBAC7G,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,YAAY,GAAG,UAAU,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,SAAS;gBAAE,MAAM,CAAC,YAAY,GAAG,GAAG,SAAS,UAAU,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,UAAU;gBAAE,MAAM,CAAC,YAAY,GAAG,GAAG,UAAU,WAAW,CAAC;QACjE,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,aAAkC;IAElC,8CAA8C;IAC9C,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CACtD,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,UAAU;QACvB,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAClC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CACxD;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAiB;IACnD,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -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":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Self-contained types for the MCP server package.
3
+ * No workspace dependencies — this package must be independently publishable.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -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
+ }