@primeuicom/mcp 0.1.2 → 0.1.3
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 +35 -0
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/service.js +9 -2
- package/dist/service.js.map +1 -1
- package/dist/services/project-sync-service.js +1 -3
- package/dist/services/project-sync-service.js.map +1 -1
- package/dist/sources/api-provider.d.ts +23 -0
- package/dist/sources/api-provider.js +209 -0
- package/dist/sources/api-provider.js.map +1 -0
- package/dist/sources/project-data-provider.d.ts +1 -1
- package/dist/types.d.ts +3 -0
- package/package.json +3 -5
- package/dist/sources/fixture-provider.d.ts +0 -16
- package/dist/sources/fixture-provider.js +0 -76
- package/dist/sources/fixture-provider.js.map +0 -1
- package/fixtures/2026-02-17-LIOMDP.zip +0 -0
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
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAEnE,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAK1B,SAAS,QAAQ,CAAI,KAAa,EAAE,IAAO;IACzC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,YAAY,EAAE,CAAC;QACvD,iBAAiB,EAAE,IAA+B;KACnD,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,OAAO,EAAE,EAAE,CAAC;KACnE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;YACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;gBACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAEnE,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAK1B,SAAS,QAAQ,CAAI,KAAa,EAAE,IAAO;IACzC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,YAAY,EAAE,CAAC;QACvD,iBAAiB,EAAE,IAA+B;KACnD,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,OAAO,EAAE,EAAE,CAAC;KACnE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;YACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;gBACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;gBACpB,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;gBAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;gBACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;aAC3B,CAAC,CACH;SACF;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAA6B,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAuB,MAAM,MAAM,CAAC,cAAc,EAAE,CAAA;YAC9D,OAAO,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;gBACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBACd,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACtD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;aACtB,CAAC,CACH;SACF;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAA6B,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,WAAW,GAAoB,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;YAC/D,OAAO,QAAQ,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SAC/D;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;SACxB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAA2B,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAA0B,MAAM,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;YACzE,OAAO,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;SACrB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAA6B,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;YACxB,OAAO,QAAQ,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CACF,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
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 {
|
|
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
|
|
8
|
+
const apiKey = process.env.PRIMEUI_API_KEY;
|
|
9
|
+
if (!apiKey) {
|
|
10
|
+
throw new Error("PRIMEUI_API_KEY is required to start @primeuicom/mcp");
|
|
11
|
+
}
|
|
12
|
+
const provider = new ApiProjectDataProvider({
|
|
13
|
+
apiKey,
|
|
14
|
+
baseUrl: process.env.PRIMEUI_API_BASE_URL,
|
|
15
|
+
});
|
|
9
16
|
const syncService = new ProjectSyncService({ projectRoot, provider });
|
|
10
17
|
const server = createPrimeUiMcpServer(syncService);
|
|
11
18
|
const transport = new StdioServerTransport();
|
package/dist/service.js.map
CHANGED
|
@@ -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,
|
|
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,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC;QAC1C,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;KAC1C,CAAC,CAAA;IACF,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
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"project-sync-service.js","sourceRoot":"","sources":["../../src/services/project-sync-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,209 @@
|
|
|
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 response = await fetch(this.buildUrl(endpoint), {
|
|
122
|
+
method: "GET",
|
|
123
|
+
headers: {
|
|
124
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
const details = await this.readError(response);
|
|
129
|
+
throw new Error(`PrimeUI API request failed (${response.status}) while downloading export "${exportId}": ${details}`);
|
|
130
|
+
}
|
|
131
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
132
|
+
if (!isZipContentType(contentType)) {
|
|
133
|
+
throw new PrimeUiApiContractError(endpoint, `expected zip content-type but got "${contentType || "unknown"}"`);
|
|
134
|
+
}
|
|
135
|
+
if (!response.body) {
|
|
136
|
+
throw new PrimeUiApiContractError(endpoint, "response body is empty");
|
|
137
|
+
}
|
|
138
|
+
await ensureDir(path.dirname(destinationPath));
|
|
139
|
+
const zipStream = Readable.fromWeb(response.body);
|
|
140
|
+
const signatureGuard = createZipSignatureGuard(endpoint);
|
|
141
|
+
const fileStream = createWriteStream(destinationPath);
|
|
142
|
+
try {
|
|
143
|
+
await pipeline(zipStream, signatureGuard, fileStream);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
await unlink(destinationPath).catch(() => undefined);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
buildUrl(endpoint) {
|
|
151
|
+
return new URL(endpoint, this.apiRoot).toString();
|
|
152
|
+
}
|
|
153
|
+
async requestJson(endpoint, schema) {
|
|
154
|
+
const response = await fetch(this.buildUrl(endpoint), {
|
|
155
|
+
method: "GET",
|
|
156
|
+
headers: {
|
|
157
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
if (!response.ok) {
|
|
161
|
+
const details = await this.readError(response);
|
|
162
|
+
throw new Error(`PrimeUI API request failed (${response.status}) for "${endpoint}": ${details}`);
|
|
163
|
+
}
|
|
164
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
165
|
+
if (!isJsonContentType(contentType)) {
|
|
166
|
+
throw new PrimeUiApiContractError(endpoint, `expected JSON content-type but got "${contentType || "unknown"}"`);
|
|
167
|
+
}
|
|
168
|
+
let payload;
|
|
169
|
+
try {
|
|
170
|
+
payload = await response.json();
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
throw new PrimeUiApiContractError(endpoint, "response body is not valid JSON");
|
|
174
|
+
}
|
|
175
|
+
const parsed = schema.safeParse(payload);
|
|
176
|
+
if (!parsed.success) {
|
|
177
|
+
const details = parsed.error.issues
|
|
178
|
+
.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
|
|
179
|
+
.join("; ");
|
|
180
|
+
throw new PrimeUiApiContractError(endpoint, details);
|
|
181
|
+
}
|
|
182
|
+
return parsed.data;
|
|
183
|
+
}
|
|
184
|
+
async readError(response) {
|
|
185
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
186
|
+
try {
|
|
187
|
+
if (contentType.includes("application/json")) {
|
|
188
|
+
const body = (await response.json());
|
|
189
|
+
if (body?.message && body?.code) {
|
|
190
|
+
return `${body.code}: ${body.message}`;
|
|
191
|
+
}
|
|
192
|
+
if (body?.message) {
|
|
193
|
+
return body.message;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
const bodyText = await response.text();
|
|
198
|
+
if (bodyText.trim()) {
|
|
199
|
+
return bodyText.trim();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// No-op: fall through to generic status text.
|
|
205
|
+
}
|
|
206
|
+
return response.statusText || "Unknown error";
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# 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
|
-
|
|
5
|
+
downloadExportArchive(exportId: string, destinationPath: string): Promise<void>;
|
|
6
6
|
}
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@primeuicom/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
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
|
|
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
|