@primeuicom/mcp 0.1.2 → 0.1.4

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 CHANGED
@@ -2,6 +2,41 @@
2
2
 
3
3
  PrimeUI MCP server package.
4
4
 
5
+ ## Runtime
6
+
7
+ The package uses Studio API v1 with bearer authentication.
8
+
9
+ Required env:
10
+ - `PRIMEUI_API_KEY`
11
+
12
+ Optional env:
13
+ - `PRIMEUI_API_BASE_URL`
14
+ - if set: MCP calls this base URL,
15
+ - if not set: MCP defaults to `https://app.primeui.com/`.
16
+
17
+ The API root is normalized to `/api/v1`.
18
+
19
+ Example `.mcp.json`:
20
+
21
+ ```json
22
+ {
23
+ "mcpServers": {
24
+ "primeui": {
25
+ "type": "stdio",
26
+ "command": "npx",
27
+ "args": ["-y", "@primeuicom/mcp@latest"],
28
+ "env": {
29
+ "PRIMEUI_API_KEY": "<issued-api-key>"
30
+ }
31
+ }
32
+ }
33
+ }
34
+ ```
35
+
36
+ ## Token revocation note
37
+
38
+ API keys embed `ver` (token version). Future revocation/rotation is implemented by incrementing `project_api_access.token_version`.
39
+
5
40
  ## Local dev
6
41
 
7
42
  ```bash
package/dist/server.js CHANGED
@@ -31,6 +31,9 @@ export function createPrimeUiMcpServer(source) {
31
31
  title: z.string(),
32
32
  slug: z.string(),
33
33
  pageType: z.string(),
34
+ isReadyToExport: z.boolean(),
35
+ pagePath: z.string(),
36
+ componentsPath: z.string(),
34
37
  })),
35
38
  },
36
39
  annotations: {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/service.js CHANGED
@@ -2,10 +2,17 @@
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import { createPrimeUiMcpServer } from "./server.js";
4
4
  import { ProjectSyncService } from "./services/project-sync-service.js";
5
- import { FixtureProjectDataProvider } from "./sources/fixture-provider.js";
5
+ import { ApiProjectDataProvider } from "./sources/api-provider.js";
6
6
  async function main() {
7
7
  const projectRoot = process.env.PRIMEUI_PROJECT_ROOT || process.cwd();
8
- const provider = new FixtureProjectDataProvider({ projectRoot });
8
+ const apiKey = process.env.PRIMEUI_API_KEY;
9
+ const provider = new ApiProjectDataProvider({
10
+ apiKey,
11
+ baseUrl: process.env.PRIMEUI_API_BASE_URL,
12
+ });
13
+ if (!apiKey) {
14
+ console.error("[primeui-mcp] warning: PRIMEUI_API_KEY is not set; API-backed tools will fail until it is configured.");
15
+ }
9
16
  const syncService = new ProjectSyncService({ projectRoot, provider });
10
17
  const server = createPrimeUiMcpServer(syncService);
11
18
  const transport = new StdioServerTransport();
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAE1E,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACrE,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IAChE,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAA;IAElD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE/B,OAAO,CAAC,KAAK,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAA;AACjE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAA;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAElE,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;IAE1C,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC;QAC1C,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;KAC1C,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,uGAAuG,CACxG,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAA;IAElD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE/B,OAAO,CAAC,KAAK,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAA;AACjE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAA;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -1,4 +1,3 @@
1
- import { copyFile } from "node:fs/promises";
2
1
  import path from "node:path";
3
2
  import { ensureDir, extractZip, resetDir, writeUtf8 } from "../lib/fs.js";
4
3
  export class ProjectSyncService {
@@ -29,11 +28,10 @@ export class ProjectSyncService {
29
28
  if (!selected) {
30
29
  throw new Error(`Export not found: ${id}`);
31
30
  }
32
- const sourceZipPath = await this.provider.resolveExportArchivePath(id);
33
31
  const targetZipPath = path.join(this.exportsRoot, `${id}.zip`);
34
32
  const targetProjectPath = path.join(this.exportsRoot, id);
35
33
  await ensureDir(this.exportsRoot);
36
- await copyFile(sourceZipPath, targetZipPath);
34
+ await this.provider.downloadExportArchive(id, targetZipPath);
37
35
  await resetDir(targetProjectPath);
38
36
  await extractZip(targetZipPath, targetProjectPath);
39
37
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"project-sync-service.js","sourceRoot":"","sources":["../../src/services/project-sync-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-sync-service.js","sourceRoot":"","sources":["../../src/services/project-sync-service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAUzE,MAAM,OAAO,kBAAkB;IACZ,QAAQ,CAAqB;IAC7B,WAAW,CAAQ;IACnB,WAAW,CAAQ;IACnB,QAAQ,CAAQ;IAChB,WAAW,CAAQ;IAEpC,YAAY,OAAkC;QAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,EAAU;QACjC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAE7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAE3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;QAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAEzD,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAA;QAE5D,MAAM,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QACjC,MAAM,UAAU,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAA;QAElD,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,iBAAiB;SAC/B,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC7B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;QACzD,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACnC,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9B,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3D,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { PrimeUiExport, PrimeUiProjectInfo } from "../types.js";
2
+ import type { ProjectDataProvider } from "./project-data-provider.js";
3
+ type ApiProjectDataProviderOptions = {
4
+ apiKey?: string;
5
+ baseUrl?: string;
6
+ };
7
+ export declare class ApiProjectDataProvider implements ProjectDataProvider {
8
+ private readonly apiKey?;
9
+ private readonly apiRoot;
10
+ constructor(options: ApiProjectDataProviderOptions);
11
+ getProjectInfo(): Promise<PrimeUiProjectInfo>;
12
+ listExports(): Promise<PrimeUiExport[]>;
13
+ /**
14
+ * Consumer-side runtime contract for GET /api/v1/project/exports/:exportId/download.
15
+ * Producer source of truth: apps/studio/src/app/api/v1/project/exports/[exportId]/download/route.ts
16
+ * Keep content-type and archive format checks synchronized with the producer response.
17
+ */
18
+ downloadExportArchive(exportId: string, destinationPath: string): Promise<void>;
19
+ private buildUrl;
20
+ private requestJson;
21
+ private readError;
22
+ private requireApiKey;
23
+ }
24
+ export {};
@@ -0,0 +1,218 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import { unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { Readable, Transform } from "node:stream";
5
+ import { pipeline } from "node:stream/promises";
6
+ import { z } from "zod";
7
+ import { ensureDir } from "../lib/fs.js";
8
+ const DEFAULT_API_BASE_URL = "https://app.primeui.com/";
9
+ const ZIP_CONTENT_TYPES = ["application/zip", "application/octet-stream", "application/x-zip-compressed"];
10
+ /**
11
+ * Consumer-side runtime contract for GET /api/v1/project.
12
+ * Producer source of truth: apps/studio/src/app/api/v1/project/route.ts
13
+ * Keep this schema synchronized with the producer payload.
14
+ */
15
+ const projectInfoSchema = z.object({
16
+ projectId: z.string(),
17
+ projectName: z.string(),
18
+ metadata: z.record(z.unknown()),
19
+ pages: z.array(z.object({
20
+ id: z.string(),
21
+ title: z.string(),
22
+ slug: z.string(),
23
+ pageType: z.string(),
24
+ isReadyToExport: z.boolean(),
25
+ pagePath: z.string(),
26
+ componentsPath: z.string(),
27
+ })),
28
+ });
29
+ /**
30
+ * Consumer-side runtime contract for GET /api/v1/project/exports.
31
+ * Producer source of truth: apps/studio/src/app/api/v1/project/exports/route.ts
32
+ * Keep this schema synchronized with the producer payload.
33
+ */
34
+ const exportsResponseSchema = z.object({
35
+ exports: z.array(z.object({
36
+ id: z.string(),
37
+ status: z.enum(["in_progress", "completed", "failed"]),
38
+ createdAt: z.string().datetime({ offset: true }),
39
+ })),
40
+ });
41
+ class PrimeUiApiContractError extends Error {
42
+ constructor(endpoint, details) {
43
+ super(`PrimeUI API contract mismatch for "${endpoint}": ${details}`);
44
+ this.name = "PrimeUiApiContractError";
45
+ }
46
+ }
47
+ const normalizeApiRoot = (rawBaseUrl) => {
48
+ const normalizedBase = rawBaseUrl.trim() || DEFAULT_API_BASE_URL;
49
+ const parsed = new URL(normalizedBase);
50
+ const normalizedPath = parsed.pathname.replace(/\/+$/, "");
51
+ if (normalizedPath.endsWith("/api/v1")) {
52
+ parsed.pathname = `${normalizedPath}/`;
53
+ return parsed.toString();
54
+ }
55
+ parsed.pathname = `${normalizedPath}/api/v1/`.replace("//api/v1/", "/api/v1/");
56
+ return parsed.toString();
57
+ };
58
+ const isJsonContentType = (contentType) => contentType.includes("application/json") || contentType.includes("+json");
59
+ const isZipContentType = (contentType) => ZIP_CONTENT_TYPES.some((allowedType) => contentType.includes(allowedType));
60
+ const looksLikeZipArchive = (buffer) => {
61
+ if (buffer.length < 4) {
62
+ return false;
63
+ }
64
+ if (buffer[0] !== 0x50 || buffer[1] !== 0x4b) {
65
+ return false;
66
+ }
67
+ const signature = `${buffer[2]}:${buffer[3]}`;
68
+ return signature === "3:4" || signature === "5:6" || signature === "7:8";
69
+ };
70
+ const createZipSignatureGuard = (endpoint) => {
71
+ let signature = Buffer.alloc(0);
72
+ let validated = false;
73
+ return new Transform({
74
+ transform(chunk, _encoding, callback) {
75
+ const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
76
+ if (!validated) {
77
+ const requiredBytes = Math.max(0, 4 - signature.length);
78
+ if (requiredBytes > 0) {
79
+ signature = Buffer.concat([signature, chunkBuffer.subarray(0, requiredBytes)]);
80
+ }
81
+ if (signature.length >= 4) {
82
+ if (!looksLikeZipArchive(signature)) {
83
+ callback(new PrimeUiApiContractError(endpoint, "response body is not a valid zip archive"));
84
+ return;
85
+ }
86
+ validated = true;
87
+ }
88
+ }
89
+ callback(null, chunkBuffer);
90
+ },
91
+ flush(callback) {
92
+ if (!validated) {
93
+ callback(new PrimeUiApiContractError(endpoint, "response body is not a valid zip archive"));
94
+ return;
95
+ }
96
+ callback();
97
+ },
98
+ });
99
+ };
100
+ export class ApiProjectDataProvider {
101
+ apiKey;
102
+ apiRoot;
103
+ constructor(options) {
104
+ this.apiKey = options.apiKey;
105
+ this.apiRoot = normalizeApiRoot(options.baseUrl ?? DEFAULT_API_BASE_URL);
106
+ }
107
+ async getProjectInfo() {
108
+ return this.requestJson("project", projectInfoSchema);
109
+ }
110
+ async listExports() {
111
+ const response = await this.requestJson("project/exports", exportsResponseSchema);
112
+ return response.exports;
113
+ }
114
+ /**
115
+ * Consumer-side runtime contract for GET /api/v1/project/exports/:exportId/download.
116
+ * Producer source of truth: apps/studio/src/app/api/v1/project/exports/[exportId]/download/route.ts
117
+ * Keep content-type and archive format checks synchronized with the producer response.
118
+ */
119
+ async downloadExportArchive(exportId, destinationPath) {
120
+ const endpoint = `project/exports/${encodeURIComponent(exportId)}/download`;
121
+ const apiKey = this.requireApiKey();
122
+ const response = await fetch(this.buildUrl(endpoint), {
123
+ method: "GET",
124
+ headers: {
125
+ Authorization: `Bearer ${apiKey}`,
126
+ },
127
+ });
128
+ if (!response.ok) {
129
+ const details = await this.readError(response);
130
+ throw new Error(`PrimeUI API request failed (${response.status}) while downloading export "${exportId}": ${details}`);
131
+ }
132
+ const contentType = response.headers.get("content-type") ?? "";
133
+ if (!isZipContentType(contentType)) {
134
+ throw new PrimeUiApiContractError(endpoint, `expected zip content-type but got "${contentType || "unknown"}"`);
135
+ }
136
+ if (!response.body) {
137
+ throw new PrimeUiApiContractError(endpoint, "response body is empty");
138
+ }
139
+ await ensureDir(path.dirname(destinationPath));
140
+ const zipStream = Readable.fromWeb(response.body);
141
+ const signatureGuard = createZipSignatureGuard(endpoint);
142
+ const fileStream = createWriteStream(destinationPath);
143
+ try {
144
+ await pipeline(zipStream, signatureGuard, fileStream);
145
+ }
146
+ catch (error) {
147
+ await unlink(destinationPath).catch(() => undefined);
148
+ throw error;
149
+ }
150
+ }
151
+ buildUrl(endpoint) {
152
+ return new URL(endpoint, this.apiRoot).toString();
153
+ }
154
+ async requestJson(endpoint, schema) {
155
+ const apiKey = this.requireApiKey();
156
+ const response = await fetch(this.buildUrl(endpoint), {
157
+ method: "GET",
158
+ headers: {
159
+ Authorization: `Bearer ${apiKey}`,
160
+ },
161
+ });
162
+ if (!response.ok) {
163
+ const details = await this.readError(response);
164
+ throw new Error(`PrimeUI API request failed (${response.status}) for "${endpoint}": ${details}`);
165
+ }
166
+ const contentType = response.headers.get("content-type") ?? "";
167
+ if (!isJsonContentType(contentType)) {
168
+ throw new PrimeUiApiContractError(endpoint, `expected JSON content-type but got "${contentType || "unknown"}"`);
169
+ }
170
+ let payload;
171
+ try {
172
+ payload = await response.json();
173
+ }
174
+ catch {
175
+ throw new PrimeUiApiContractError(endpoint, "response body is not valid JSON");
176
+ }
177
+ const parsed = schema.safeParse(payload);
178
+ if (!parsed.success) {
179
+ const details = parsed.error.issues
180
+ .map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
181
+ .join("; ");
182
+ throw new PrimeUiApiContractError(endpoint, details);
183
+ }
184
+ return parsed.data;
185
+ }
186
+ async readError(response) {
187
+ const contentType = response.headers.get("content-type") ?? "";
188
+ try {
189
+ if (contentType.includes("application/json")) {
190
+ const body = (await response.json());
191
+ if (body?.message && body?.code) {
192
+ return `${body.code}: ${body.message}`;
193
+ }
194
+ if (body?.message) {
195
+ return body.message;
196
+ }
197
+ }
198
+ else {
199
+ const bodyText = await response.text();
200
+ if (bodyText.trim()) {
201
+ return bodyText.trim();
202
+ }
203
+ }
204
+ }
205
+ catch {
206
+ // No-op: fall through to generic status text.
207
+ }
208
+ return response.statusText || "Unknown error";
209
+ }
210
+ requireApiKey() {
211
+ const apiKey = this.apiKey?.trim();
212
+ if (!apiKey) {
213
+ throw new Error("PRIMEUI_API_KEY is required to call PrimeUI API tools.");
214
+ }
215
+ return apiKey;
216
+ }
217
+ }
218
+ //# sourceMappingURL=api-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-provider.js","sourceRoot":"","sources":["../../src/sources/api-provider.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@ import type { PrimeUiExport, PrimeUiProjectInfo } from "../types.js";
2
2
  export interface ProjectDataProvider {
3
3
  getProjectInfo(): Promise<PrimeUiProjectInfo>;
4
4
  listExports(): Promise<PrimeUiExport[]>;
5
- resolveExportArchivePath(exportId: string): Promise<string>;
5
+ downloadExportArchive(exportId: string, destinationPath: string): Promise<void>;
6
6
  }
package/dist/types.d.ts CHANGED
@@ -4,6 +4,9 @@ export interface PrimeUiProjectPage {
4
4
  title: string;
5
5
  slug: string;
6
6
  pageType: string;
7
+ isReadyToExport: boolean;
8
+ pagePath: string;
9
+ componentsPath: string;
7
10
  }
8
11
  export interface PrimeUiProjectInfo {
9
12
  projectId: string;
package/package.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "name": "@primeuicom/mcp",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "main": "dist/service.js",
6
6
  "bin": {
7
7
  "primeui-mcp": "dist/service.js"
8
8
  },
9
9
  "files": [
10
- "dist",
11
- "fixtures"
10
+ "dist"
12
11
  ],
13
12
  "scripts": {
14
13
  "clean": "rm -rf dist",
@@ -16,7 +15,7 @@
16
15
  "typecheck": "tsc --noEmit",
17
16
  "dev": "tsx src/service.ts",
18
17
  "test": "vitest run",
19
- "inspect": "pnpm exec mcp-inspector tsx src/service.ts",
18
+ "inspect": "pnpm dlx @modelcontextprotocol/inspector tsx src/service.ts",
20
19
  "prepack": "pnpm run build"
21
20
  },
22
21
  "dependencies": {
@@ -24,7 +23,6 @@
24
23
  "zod": "^3.25.76"
25
24
  },
26
25
  "devDependencies": {
27
- "@modelcontextprotocol/inspector": "^0.20.0",
28
26
  "@types/node": "^24.0.0",
29
27
  "tsx": "^4.21.0",
30
28
  "typescript": "5.8.2",
@@ -1,16 +0,0 @@
1
- import type { PrimeUiExport, PrimeUiProjectInfo } from "../types.js";
2
- import type { ProjectDataProvider } from "./project-data-provider.js";
3
- type FixtureProjectDataProviderOptions = {
4
- projectRoot: string;
5
- fixtureArchivePath?: string;
6
- };
7
- export declare class FixtureProjectDataProvider implements ProjectDataProvider {
8
- private readonly projectRoot;
9
- private readonly fixtureArchivePath;
10
- constructor(options: FixtureProjectDataProviderOptions);
11
- getProjectInfo(): Promise<PrimeUiProjectInfo>;
12
- listExports(): Promise<PrimeUiExport[]>;
13
- resolveExportArchivePath(exportId: string): Promise<string>;
14
- private resolvePath;
15
- }
16
- export {};
@@ -1,76 +0,0 @@
1
- import path from "node:path";
2
- import { readFile } from "node:fs/promises";
3
- import { fileURLToPath } from "node:url";
4
- // TEMPORARY: phase 1 fixture data lives in this module until API integration is ready.
5
- const PHASE1_FIXTURE_ARCHIVE_PATH = fileURLToPath(new URL("../../fixtures/2026-02-17-LIOMDP.zip", import.meta.url));
6
- const PHASE1_PROJECT_DESCRIPTION = "Temporary phase 1 project description.";
7
- const FIXTURE_PROJECT_INFO = {
8
- projectId: "primeui-phase1-project",
9
- projectName: "PrimeUI Phase 1 Project",
10
- metadata: {
11
- phase: "phase-1",
12
- },
13
- pages: [
14
- {
15
- id: "page-home",
16
- title: "Home",
17
- slug: "/",
18
- pageType: "landing",
19
- },
20
- {
21
- id: "page-pricing",
22
- title: "Pricing",
23
- slug: "/pricing",
24
- pageType: "pricing",
25
- },
26
- ],
27
- };
28
- const FIXTURE_EXPORTS = [
29
- {
30
- id: "export-2026-02-17-liomdp",
31
- status: "completed",
32
- createdAt: "2026-02-17T06:57:00.000Z",
33
- },
34
- ];
35
- export class FixtureProjectDataProvider {
36
- projectRoot;
37
- fixtureArchivePath;
38
- constructor(options) {
39
- this.projectRoot = options.projectRoot;
40
- this.fixtureArchivePath = options.fixtureArchivePath
41
- ? this.resolvePath(options.fixtureArchivePath)
42
- : PHASE1_FIXTURE_ARCHIVE_PATH;
43
- }
44
- async getProjectInfo() {
45
- return {
46
- ...FIXTURE_PROJECT_INFO,
47
- metadata: {
48
- ...FIXTURE_PROJECT_INFO.metadata,
49
- "project-description": PHASE1_PROJECT_DESCRIPTION,
50
- },
51
- };
52
- }
53
- async listExports() {
54
- return [...FIXTURE_EXPORTS];
55
- }
56
- async resolveExportArchivePath(exportId) {
57
- const selected = FIXTURE_EXPORTS.find((item) => item.id === exportId);
58
- if (!selected) {
59
- throw new Error(`Export not found: ${exportId}`);
60
- }
61
- try {
62
- await readFile(this.fixtureArchivePath);
63
- return this.fixtureArchivePath;
64
- }
65
- catch {
66
- throw new Error(`Fixture archive not found at "${this.fixtureArchivePath}". Update PHASE1_FIXTURE_ARCHIVE_PATH in fixture-provider.ts.`);
67
- }
68
- }
69
- resolvePath(rawPath) {
70
- if (path.isAbsolute(rawPath)) {
71
- return rawPath;
72
- }
73
- return path.resolve(this.projectRoot, rawPath);
74
- }
75
- }
76
- //# sourceMappingURL=fixture-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixture-provider.js","sourceRoot":"","sources":["../../src/sources/fixture-provider.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAUxC,uFAAuF;AACvF,MAAM,2BAA2B,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,sCAAsC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACnH,MAAM,0BAA0B,GAAG,wCAAwC,CAAA;AAE3E,MAAM,oBAAoB,GAAuB;IAC/C,SAAS,EAAE,wBAAwB;IACnC,WAAW,EAAE,yBAAyB;IACtC,QAAQ,EAAE;QACR,KAAK,EAAE,SAAS;KACjB;IACD,KAAK,EAAE;QACL;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,SAAS;SACpB;KACF;CACF,CAAA;AAED,MAAM,eAAe,GAAoB;IACvC;QACE,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,0BAA0B;KACtC;CACF,CAAA;AAED,MAAM,OAAO,0BAA0B;IACpB,WAAW,CAAQ;IACnB,kBAAkB,CAAQ;IAE3C,YAAY,OAA0C;QACpD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB;YAClD,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAC9C,CAAC,CAAC,2BAA2B,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO;YACL,GAAG,oBAAoB;YACvB,QAAQ,EAAE;gBACR,GAAG,oBAAoB,CAAC,QAAQ;gBAChC,qBAAqB,EAAE,0BAA0B;aAClD;SACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,GAAG,eAAe,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,QAAgB;QAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QAErE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YACvC,OAAO,IAAI,CAAC,kBAAkB,CAAA;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,kBAAkB,+DAA+D,CACxH,CAAA;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;CACF"}
Binary file