mcp-stitch 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +122 -0
  2. package/dist/config/stitch.d.ts +11 -0
  3. package/dist/config/stitch.d.ts.map +1 -0
  4. package/dist/config/stitch.js +38 -0
  5. package/dist/config/stitch.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +21 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/models/stitch.d.ts +20 -0
  11. package/dist/models/stitch.d.ts.map +1 -0
  12. package/dist/models/stitch.js +2 -0
  13. package/dist/models/stitch.js.map +1 -0
  14. package/dist/services/stitchClient.d.ts +8 -0
  15. package/dist/services/stitchClient.d.ts.map +1 -0
  16. package/dist/services/stitchClient.js +189 -0
  17. package/dist/services/stitchClient.js.map +1 -0
  18. package/dist/tools/status.d.ts +3 -0
  19. package/dist/tools/status.d.ts.map +1 -0
  20. package/dist/tools/status.js +50 -0
  21. package/dist/tools/status.js.map +1 -0
  22. package/dist/tools/stitchDesignSystems.d.ts +3 -0
  23. package/dist/tools/stitchDesignSystems.d.ts.map +1 -0
  24. package/dist/tools/stitchDesignSystems.js +340 -0
  25. package/dist/tools/stitchDesignSystems.js.map +1 -0
  26. package/dist/tools/stitchExport.d.ts +3 -0
  27. package/dist/tools/stitchExport.d.ts.map +1 -0
  28. package/dist/tools/stitchExport.js +923 -0
  29. package/dist/tools/stitchExport.js.map +1 -0
  30. package/dist/tools/stitchProjects.d.ts +3 -0
  31. package/dist/tools/stitchProjects.d.ts.map +1 -0
  32. package/dist/tools/stitchProjects.js +125 -0
  33. package/dist/tools/stitchProjects.js.map +1 -0
  34. package/dist/tools/stitchScreens.d.ts +3 -0
  35. package/dist/tools/stitchScreens.d.ts.map +1 -0
  36. package/dist/tools/stitchScreens.js +320 -0
  37. package/dist/tools/stitchScreens.js.map +1 -0
  38. package/dist/utils/redact.d.ts +3 -0
  39. package/dist/utils/redact.d.ts.map +1 -0
  40. package/dist/utils/redact.js +14 -0
  41. package/dist/utils/redact.js.map +1 -0
  42. package/dist/utils/safePath.d.ts +3 -0
  43. package/dist/utils/safePath.d.ts.map +1 -0
  44. package/dist/utils/safePath.js +81 -0
  45. package/dist/utils/safePath.js.map +1 -0
  46. package/dist/utils/stitchIds.d.ts +12 -0
  47. package/dist/utils/stitchIds.d.ts.map +1 -0
  48. package/dist/utils/stitchIds.js +48 -0
  49. package/dist/utils/stitchIds.js.map +1 -0
  50. package/dist/utils/stitchResponse.d.ts +11 -0
  51. package/dist/utils/stitchResponse.d.ts.map +1 -0
  52. package/dist/utils/stitchResponse.js +71 -0
  53. package/dist/utils/stitchResponse.js.map +1 -0
  54. package/dist/utils/stitchScreenResolver.d.ts +26 -0
  55. package/dist/utils/stitchScreenResolver.d.ts.map +1 -0
  56. package/dist/utils/stitchScreenResolver.js +159 -0
  57. package/dist/utils/stitchScreenResolver.js.map +1 -0
  58. package/dist/utils/stitchToolHelpers.d.ts +6 -0
  59. package/dist/utils/stitchToolHelpers.d.ts.map +1 -0
  60. package/dist/utils/stitchToolHelpers.js +25 -0
  61. package/dist/utils/stitchToolHelpers.js.map +1 -0
  62. package/docs/stitch-tools.md +389 -0
  63. package/package.json +40 -0
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # mcp-stitch
2
+
3
+ MCP server for Google Stitch. It exposes Stitch project, screen, design-system, generation, edit, variant, and artifact export tools over stdio for VS Code and other MCP-compatible agents.
4
+
5
+ ## Requirements
6
+
7
+ - Node.js 20 or newer
8
+ - A Google API key with access to Stitch
9
+
10
+ ## Environment
11
+
12
+ Required:
13
+
14
+ - `GOOGLE_API_KEY`
15
+
16
+ Recommended:
17
+
18
+ - `PROJECT_ROOT`: workspace/project directory where exported Stitch artifacts should be written
19
+
20
+ Optional:
21
+
22
+ - `STITCH_API_BASE_URL`: defaults to `https://stitch.googleapis.com/mcp`
23
+ - `STITCH_OUTPUT_DIR`: fallback output root when `PROJECT_ROOT` is not set
24
+ - `STITCH_TIMEOUT_MS`: defaults to `30000`
25
+ - `STITCH_MAX_RETRIES`: defaults to `2`
26
+
27
+ ## VS Code Setup
28
+
29
+ VS Code can load MCP servers from a workspace `.vscode/mcp.json` file or from your user MCP configuration.
30
+
31
+ For a published npm package, use:
32
+
33
+ ```json
34
+ {
35
+ "servers": {
36
+ "stitch": {
37
+ "type": "stdio",
38
+ "command": "npx",
39
+ "args": ["-y", "mcp-stitch"],
40
+ "env": {
41
+ "GOOGLE_API_KEY": "${input:stitchApiKey}",
42
+ "PROJECT_ROOT": "${workspaceFolder}"
43
+ }
44
+ }
45
+ },
46
+ "inputs": [
47
+ {
48
+ "id": "stitchApiKey",
49
+ "type": "promptString",
50
+ "description": "Google API key for Stitch",
51
+ "password": true
52
+ }
53
+ ]
54
+ }
55
+ ```
56
+
57
+ For local development before publishing, build this repo and point VS Code at the compiled entrypoint:
58
+
59
+ ```json
60
+ {
61
+ "servers": {
62
+ "stitch": {
63
+ "type": "stdio",
64
+ "command": "node",
65
+ "args": ["/absolute/path/to/mcp-stitch/dist/index.js"],
66
+ "env": {
67
+ "GOOGLE_API_KEY": "${input:stitchApiKey}",
68
+ "PROJECT_ROOT": "${workspaceFolder}"
69
+ }
70
+ }
71
+ },
72
+ "inputs": [
73
+ {
74
+ "id": "stitchApiKey",
75
+ "type": "promptString",
76
+ "description": "Google API key for Stitch",
77
+ "password": true
78
+ }
79
+ ]
80
+ }
81
+ ```
82
+
83
+ After VS Code starts the server, ask your agent to call `stitch_status` to confirm the setup.
84
+
85
+ ## Tools
86
+
87
+ - `stitch_status`
88
+ - `stitch_list_projects`
89
+ - `stitch_get_project`
90
+ - `stitch_create_project`
91
+ - `stitch_list_screens`
92
+ - `stitch_get_screen`
93
+ - `stitch_generate_screen_from_text`
94
+ - `stitch_edit_screens`
95
+ - `stitch_generate_variants`
96
+ - `stitch_upload_design_md`
97
+ - `stitch_create_design_system`
98
+ - `stitch_create_design_system_from_design_md`
99
+ - `stitch_update_design_system`
100
+ - `stitch_list_design_systems`
101
+ - `stitch_apply_design_system`
102
+ - `stitch_export_screen_artifact`
103
+
104
+ Mutating tools require `confirm: true`.
105
+
106
+ ## Development
107
+
108
+ ```bash
109
+ npm install
110
+ npm run build
111
+ npm run dev
112
+ ```
113
+
114
+ ## Publishing Checklist
115
+
116
+ ```bash
117
+ npm run build
118
+ npm pack --dry-run
119
+ npm publish
120
+ ```
121
+
122
+ See [docs/stitch-tools.md](docs/stitch-tools.md) for detailed tool inputs and Stitch contract notes.
@@ -0,0 +1,11 @@
1
+ export declare const DEFAULT_STITCH_API_BASE_URL = "https://stitch.googleapis.com/mcp";
2
+ export type StitchConfig = {
3
+ apiKey: string;
4
+ baseUrl: string;
5
+ timeoutMs: number;
6
+ maxRetries: number;
7
+ outputDir: string;
8
+ };
9
+ export declare function getStitchConfig(): StitchConfig;
10
+ export declare function validateStitchApiConfig(config: StitchConfig): string[];
11
+ //# sourceMappingURL=stitch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/config/stitch.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAE/E,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAeF,wBAAgB,eAAe,IAAI,YAAY,CAmB9C;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAQtE"}
@@ -0,0 +1,38 @@
1
+ import path from "node:path";
2
+ export const DEFAULT_STITCH_API_BASE_URL = "https://stitch.googleapis.com/mcp";
3
+ function parsePositiveInt(value, fallback) {
4
+ if (!value)
5
+ return fallback;
6
+ const parsed = Number.parseInt(value, 10);
7
+ if (!Number.isFinite(parsed) || parsed <= 0)
8
+ return fallback;
9
+ return parsed;
10
+ }
11
+ function getProjectRoot() {
12
+ return process.env.PROJECT_ROOT?.trim() || process.cwd();
13
+ }
14
+ export function getStitchConfig() {
15
+ const apiKey = process.env.GOOGLE_API_KEY?.trim() ?? "";
16
+ const baseUrl = process.env.STITCH_API_BASE_URL?.trim() || DEFAULT_STITCH_API_BASE_URL;
17
+ const timeoutMs = parsePositiveInt(process.env.STITCH_TIMEOUT_MS, 30000);
18
+ const maxRetries = parsePositiveInt(process.env.STITCH_MAX_RETRIES, 2);
19
+ const rawOutputDir = process.env.STITCH_OUTPUT_DIR?.trim();
20
+ const outputDir = rawOutputDir
21
+ ? path.resolve(rawOutputDir)
22
+ : path.resolve(getProjectRoot(), "stitch-output");
23
+ return {
24
+ apiKey,
25
+ baseUrl,
26
+ timeoutMs,
27
+ maxRetries,
28
+ outputDir,
29
+ };
30
+ }
31
+ export function validateStitchApiConfig(config) {
32
+ const errors = [];
33
+ if (!config.apiKey) {
34
+ errors.push("Missing GOOGLE_API_KEY environment variable.");
35
+ }
36
+ return errors;
37
+ }
38
+ //# sourceMappingURL=stitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/config/stitch.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAU/E,SAAS,gBAAgB,CAAC,KAAyB,EAAE,QAAgB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE7D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,2BAA2B,CAAC;IAEvF,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,YAAY;QAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,eAAe,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,OAAO;QACP,SAAS;QACT,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "dotenv/config";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,OAAO,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import "dotenv/config";
5
+ import { registerStitchStatusTool } from "./tools/status.js";
6
+ import { registerStitchProjectTools } from "./tools/stitchProjects.js";
7
+ import { registerStitchScreenTools } from "./tools/stitchScreens.js";
8
+ import { registerStitchDesignSystemTools } from "./tools/stitchDesignSystems.js";
9
+ import { registerStitchExportTool } from "./tools/stitchExport.js";
10
+ const server = new McpServer({
11
+ name: "mcp-stitch",
12
+ version: "0.5.0",
13
+ });
14
+ registerStitchStatusTool(server);
15
+ registerStitchProjectTools(server);
16
+ registerStitchScreenTools(server);
17
+ registerStitchDesignSystemTools(server);
18
+ registerStitchExportTool(server);
19
+ const transport = new StdioServerTransport();
20
+ await server.connect(transport);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACnC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,+BAA+B,CAAC,MAAM,CAAC,CAAC;AACxC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAIjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export type StitchCallResult = {
3
+ ok: true;
4
+ data: unknown;
5
+ requestId: number;
6
+ status?: number;
7
+ };
8
+ export type StitchCallFailure = {
9
+ ok: false;
10
+ error: string;
11
+ requestId: number;
12
+ status?: number;
13
+ details?: unknown;
14
+ };
15
+ export type StitchCallResponse = StitchCallResult | StitchCallFailure;
16
+ export type StitchToolCall = {
17
+ toolName: string;
18
+ input: JsonObject;
19
+ };
20
+ //# sourceMappingURL=stitch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/models/stitch.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/models/stitch.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { StitchConfig } from "../config/stitch.js";
2
+ import type { StitchCallResponse, StitchToolCall } from "../models/stitch.js";
3
+ export declare class StitchClient {
4
+ private readonly config;
5
+ constructor(config: StitchConfig);
6
+ callTool(call: StitchToolCall): Promise<StitchCallResponse>;
7
+ }
8
+ //# sourceMappingURL=stitchClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitchClient.d.ts","sourceRoot":"","sources":["../../src/services/stitchClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAsD9E,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAI1B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2JlE"}
@@ -0,0 +1,189 @@
1
+ import { validateStitchApiConfig } from "../config/stitch.js";
2
+ import { toSafeErrorMessage } from "../utils/redact.js";
3
+ // Stitch transport contract:
4
+ // - HTTP POST to STITCH_API_BASE_URL, defaulting to https://stitch.googleapis.com/mcp
5
+ // - JSON-RPC envelope with method "tools/call"
6
+ // - params.name and params.arguments
7
+ // - API key sent via header "x-goog-api-key"
8
+ function shouldRetry(status) {
9
+ if (!status)
10
+ return true;
11
+ return status === 408 || status === 429 || status >= 500;
12
+ }
13
+ function toStitchErrorText(payload) {
14
+ if (!payload || typeof payload !== "object")
15
+ return null;
16
+ const obj = payload;
17
+ const errorObj = obj.error;
18
+ if (errorObj && typeof errorObj === "object") {
19
+ const e = errorObj;
20
+ const message = e.message;
21
+ if (typeof message === "string")
22
+ return message;
23
+ }
24
+ return null;
25
+ }
26
+ function toToolContentError(payload) {
27
+ if (!payload || typeof payload !== "object")
28
+ return null;
29
+ const obj = payload;
30
+ const result = obj.result;
31
+ if (!result || typeof result !== "object")
32
+ return null;
33
+ const resultObj = result;
34
+ if (resultObj.isError !== true)
35
+ return null;
36
+ const content = resultObj.content;
37
+ if (!Array.isArray(content) || content.length === 0) {
38
+ return "Stitch tool returned isError=true.";
39
+ }
40
+ const first = content[0];
41
+ if (first && typeof first === "object") {
42
+ const text = first.text;
43
+ if (typeof text === "string" && text.trim().length > 0) {
44
+ return text.trim();
45
+ }
46
+ }
47
+ return "Stitch tool returned isError=true.";
48
+ }
49
+ export class StitchClient {
50
+ config;
51
+ constructor(config) {
52
+ this.config = config;
53
+ }
54
+ async callTool(call) {
55
+ const configErrors = validateStitchApiConfig(this.config);
56
+ const requestId = Date.now();
57
+ if (configErrors.length > 0) {
58
+ return {
59
+ ok: false,
60
+ error: configErrors.join(" "),
61
+ requestId,
62
+ };
63
+ }
64
+ const body = {
65
+ jsonrpc: "2.0",
66
+ id: requestId,
67
+ method: "tools/call",
68
+ params: {
69
+ name: call.toolName,
70
+ arguments: call.input,
71
+ },
72
+ };
73
+ let attempt = 0;
74
+ let lastError = "Unknown Stitch API error.";
75
+ let lastStatus;
76
+ while (attempt <= this.config.maxRetries) {
77
+ const controller = new AbortController();
78
+ const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);
79
+ try {
80
+ const response = await fetch(this.config.baseUrl, {
81
+ method: "POST",
82
+ headers: {
83
+ "content-type": "application/json",
84
+ "x-goog-api-key": this.config.apiKey,
85
+ },
86
+ body: JSON.stringify(body),
87
+ signal: controller.signal,
88
+ });
89
+ clearTimeout(timeout);
90
+ lastStatus = response.status;
91
+ const text = await response.text();
92
+ let payload = null;
93
+ try {
94
+ payload = text ? JSON.parse(text) : null;
95
+ }
96
+ catch {
97
+ payload = { raw: text };
98
+ }
99
+ if (!response.ok) {
100
+ const apiMessage = toStitchErrorText(payload);
101
+ lastError = apiMessage ?? `Stitch API request failed with status ${response.status}.`;
102
+ if (shouldRetry(response.status) && attempt < this.config.maxRetries) {
103
+ attempt += 1;
104
+ continue;
105
+ }
106
+ return {
107
+ ok: false,
108
+ error: lastError,
109
+ requestId,
110
+ status: response.status,
111
+ details: payload,
112
+ };
113
+ }
114
+ if (payload && typeof payload === "object") {
115
+ const obj = payload;
116
+ const apiMessage = toStitchErrorText(payload);
117
+ const toolMessage = toToolContentError(payload);
118
+ if (apiMessage) {
119
+ return {
120
+ ok: false,
121
+ error: apiMessage,
122
+ requestId,
123
+ status: response.status,
124
+ details: payload,
125
+ };
126
+ }
127
+ if (toolMessage) {
128
+ return {
129
+ ok: false,
130
+ error: toolMessage,
131
+ requestId,
132
+ status: response.status,
133
+ details: payload,
134
+ };
135
+ }
136
+ if ("result" in obj) {
137
+ return {
138
+ ok: true,
139
+ data: obj.result,
140
+ requestId,
141
+ status: response.status,
142
+ };
143
+ }
144
+ }
145
+ return {
146
+ ok: true,
147
+ data: payload,
148
+ requestId,
149
+ status: response.status,
150
+ };
151
+ }
152
+ catch (error) {
153
+ clearTimeout(timeout);
154
+ lastError = toSafeErrorMessage(error, [this.config.apiKey]);
155
+ if (attempt < this.config.maxRetries) {
156
+ attempt += 1;
157
+ continue;
158
+ }
159
+ if (lastStatus === undefined) {
160
+ return {
161
+ ok: false,
162
+ error: `Failed to call Stitch API: ${lastError}`,
163
+ requestId,
164
+ };
165
+ }
166
+ return {
167
+ ok: false,
168
+ error: `Failed to call Stitch API: ${lastError}`,
169
+ requestId,
170
+ status: lastStatus,
171
+ };
172
+ }
173
+ }
174
+ if (lastStatus === undefined) {
175
+ return {
176
+ ok: false,
177
+ error: `Failed to call Stitch API: ${lastError}`,
178
+ requestId,
179
+ };
180
+ }
181
+ return {
182
+ ok: false,
183
+ error: `Failed to call Stitch API: ${lastError}`,
184
+ requestId,
185
+ status: lastStatus,
186
+ };
187
+ }
188
+ }
189
+ //# sourceMappingURL=stitchClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitchClient.js","sourceRoot":"","sources":["../../src/services/stitchClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerStitchStatusTool(server: McpServer): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QA2CzD"}
@@ -0,0 +1,50 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { DEFAULT_STITCH_API_BASE_URL, getStitchConfig } from "../config/stitch.js";
4
+ function isConfigured(name) {
5
+ return Boolean(process.env[name]?.trim());
6
+ }
7
+ function configuredText(name) {
8
+ return isConfigured(name) ? "configured" : "missing";
9
+ }
10
+ function optionalText(name, fallback) {
11
+ return isConfigured(name) ? "configured" : fallback;
12
+ }
13
+ export function registerStitchStatusTool(server) {
14
+ server.registerTool("stitch_status", {
15
+ description: "Checks Stitch MCP setup and reports missing required, recommended, and optional environment variables without exposing secret values.",
16
+ inputSchema: z.object({}),
17
+ }, async () => {
18
+ const config = getStitchConfig();
19
+ const hasProjectRoot = isConfigured("PROJECT_ROOT");
20
+ const lines = [
21
+ "Stitch setup status",
22
+ "",
23
+ "Required configuration:",
24
+ `- GOOGLE_API_KEY: ${configuredText("GOOGLE_API_KEY")}`,
25
+ "",
26
+ "Recommended configuration:",
27
+ `- PROJECT_ROOT: ${hasProjectRoot ? "configured" : "missing"}`,
28
+ ...(hasProjectRoot
29
+ ? []
30
+ : [
31
+ " Set PROJECT_ROOT to the workspace/project directory where Stitch artifacts should be exported.",
32
+ ]),
33
+ "",
34
+ "Optional configuration:",
35
+ `- STITCH_API_BASE_URL: ${isConfigured("STITCH_API_BASE_URL") ? "configured" : `using default ${DEFAULT_STITCH_API_BASE_URL}`}`,
36
+ `- STITCH_OUTPUT_DIR: ${optionalText("STITCH_OUTPUT_DIR", `not set; defaulting to ${config.outputDir}`)}`,
37
+ `- STITCH_TIMEOUT_MS: ${optionalText("STITCH_TIMEOUT_MS", `using default ${config.timeoutMs}`)}`,
38
+ `- STITCH_MAX_RETRIES: ${optionalText("STITCH_MAX_RETRIES", `using default ${config.maxRetries}`)}`,
39
+ ];
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: lines.join("\n"),
45
+ },
46
+ ],
47
+ };
48
+ });
49
+ }
50
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEnF,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,QAAgB;IAClD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EACT,uIAAuI;QACzI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KAC1B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAG;YACZ,qBAAqB;YACrB,EAAE;YACF,yBAAyB;YACzB,qBAAqB,cAAc,CAAC,gBAAgB,CAAC,EAAE;YACvD,EAAE;YACF,4BAA4B;YAC5B,mBAAmB,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE;YAC9D,GAAG,CAAC,cAAc;gBAChB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,kGAAkG;iBACnG,CAAC;YACN,EAAE;YACF,yBAAyB;YACzB,0BAA0B,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,2BAA2B,EAAE,EAAE;YAC/H,wBAAwB,YAAY,CAAC,mBAAmB,EAAE,0BAA0B,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE;YACzG,wBAAwB,YAAY,CAAC,mBAAmB,EAAE,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE;YAChG,yBAAyB,YAAY,CAAC,oBAAoB,EAAE,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE;SACpG,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerStitchDesignSystemTools(server: McpServer): void;
3
+ //# sourceMappingURL=stitchDesignSystems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stitchDesignSystems.d.ts","sourceRoot":"","sources":["../../src/tools/stitchDesignSystems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyKpE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,QAgPhE"}