@withpica/mcp-server 2.5.1 → 2.5.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/assets/fonts/GeistSans-Light.woff2 +0 -0
- package/assets/fonts/InstrumentSerif-Italic.woff2 +0 -0
- package/assets/fonts/InstrumentSerif-Regular.woff2 +0 -0
- package/dist/apps/briefing.d.ts +2 -0
- package/dist/apps/briefing.d.ts.map +1 -0
- package/dist/apps/briefing.js +308 -0
- package/dist/apps/briefing.js.map +1 -0
- package/dist/apps/generated/shared-bundle.d.ts +5 -0
- package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
- package/dist/apps/generated/shared-bundle.js +7 -0
- package/dist/apps/generated/shared-bundle.js.map +1 -0
- package/dist/apps/shared.d.ts +4 -0
- package/dist/apps/shared.d.ts.map +1 -0
- package/dist/apps/shared.js +268 -0
- package/dist/apps/shared.js.map +1 -0
- package/dist/config.d.ts +3 -25
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -12
- package/dist/config.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/pica-sdk.d.ts +11 -0
- package/dist/pica-sdk.d.ts.map +1 -1
- package/dist/pica-sdk.js +16 -0
- package/dist/pica-sdk.js.map +1 -1
- package/dist/prompts/index.js +24 -24
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/index.d.ts +3 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +101 -53
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/llms-primer.d.ts +1 -1
- package/dist/resources/llms-primer.d.ts.map +1 -1
- package/dist/resources/llms-primer.js +4 -4
- package/dist/server-instructions.d.ts +9 -0
- package/dist/server-instructions.d.ts.map +1 -0
- package/dist/server-instructions.js +34 -0
- package/dist/server-instructions.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +30 -8
- package/dist/server.js.map +1 -1
- package/dist/tools/agreement-types.d.ts +9 -19
- package/dist/tools/agreement-types.d.ts.map +1 -1
- package/dist/tools/agreement-types.js +201 -417
- package/dist/tools/agreement-types.js.map +1 -1
- package/dist/tools/agreements.d.ts +2 -3
- package/dist/tools/agreements.d.ts.map +1 -1
- package/dist/tools/agreements.js +71 -51
- package/dist/tools/agreements.js.map +1 -1
- package/dist/tools/app-tools.d.ts +18 -0
- package/dist/tools/app-tools.d.ts.map +1 -0
- package/dist/tools/app-tools.js +87 -0
- package/dist/tools/app-tools.js.map +1 -0
- package/dist/tools/assets.d.ts +1 -3
- package/dist/tools/assets.d.ts.map +1 -1
- package/dist/tools/assets.js +63 -45
- package/dist/tools/assets.js.map +1 -1
- package/dist/tools/audio-files.d.ts +2 -3
- package/dist/tools/audio-files.d.ts.map +1 -1
- package/dist/tools/audio-files.js +61 -33
- package/dist/tools/audio-files.js.map +1 -1
- package/dist/tools/auth.d.ts +20 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +195 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/collaborators.js +1 -1
- package/dist/tools/collaborators.js.map +1 -1
- package/dist/tools/credits.d.ts.map +1 -1
- package/dist/tools/credits.js +129 -18
- package/dist/tools/credits.js.map +1 -1
- package/dist/tools/dashboard.d.ts +1 -2
- package/dist/tools/dashboard.d.ts.map +1 -1
- package/dist/tools/dashboard.js +19 -27
- package/dist/tools/dashboard.js.map +1 -1
- package/dist/tools/duplicates.d.ts.map +1 -1
- package/dist/tools/duplicates.js +15 -0
- package/dist/tools/duplicates.js.map +1 -1
- package/dist/tools/enrichment.d.ts +0 -3
- package/dist/tools/enrichment.d.ts.map +1 -1
- package/dist/tools/enrichment.js +17 -120
- package/dist/tools/enrichment.js.map +1 -1
- package/dist/tools/import-documents.d.ts +3 -3
- package/dist/tools/import-documents.d.ts.map +1 -1
- package/dist/tools/import-documents.js +64 -50
- package/dist/tools/import-documents.js.map +1 -1
- package/dist/tools/import.d.ts +1 -0
- package/dist/tools/import.d.ts.map +1 -1
- package/dist/tools/import.js +63 -1
- package/dist/tools/import.js.map +1 -1
- package/dist/tools/index.d.ts +44 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +410 -81
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/metadata.d.ts +15 -0
- package/dist/tools/metadata.d.ts.map +1 -0
- package/dist/tools/metadata.js +1057 -0
- package/dist/tools/metadata.js.map +1 -0
- package/dist/tools/people.d.ts +4 -12
- package/dist/tools/people.d.ts.map +1 -1
- package/dist/tools/people.js +151 -109
- package/dist/tools/people.js.map +1 -1
- package/dist/tools/publishers.d.ts +16 -0
- package/dist/tools/publishers.d.ts.map +1 -0
- package/dist/tools/publishers.js +69 -0
- package/dist/tools/publishers.js.map +1 -0
- package/dist/tools/recordings.d.ts +8 -8
- package/dist/tools/recordings.d.ts.map +1 -1
- package/dist/tools/recordings.js +123 -48
- package/dist/tools/recordings.js.map +1 -1
- package/dist/tools/recovery-hints.d.ts +14 -0
- package/dist/tools/recovery-hints.d.ts.map +1 -0
- package/dist/tools/recovery-hints.js +277 -0
- package/dist/tools/recovery-hints.js.map +1 -0
- package/dist/tools/royalties.js +1 -1
- package/dist/tools/royalties.js.map +1 -1
- package/dist/tools/search.js +2 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/send.d.ts +1 -2
- package/dist/tools/send.d.ts.map +1 -1
- package/dist/tools/send.js +19 -27
- package/dist/tools/send.js.map +1 -1
- package/dist/tools/split-sheets.d.ts.map +1 -1
- package/dist/tools/split-sheets.js +12 -0
- package/dist/tools/split-sheets.js.map +1 -1
- package/dist/tools/works.d.ts +4 -12
- package/dist/tools/works.d.ts.map +1 -1
- package/dist/tools/works.js +203 -116
- package/dist/tools/works.js.map +1 -1
- package/dist/utils/audit.d.ts +28 -0
- package/dist/utils/audit.d.ts.map +1 -0
- package/dist/utils/audit.js +28 -0
- package/dist/utils/audit.js.map +1 -0
- package/dist/utils/confirmation.d.ts +12 -0
- package/dist/utils/confirmation.d.ts.map +1 -0
- package/dist/utils/confirmation.js +78 -0
- package/dist/utils/confirmation.js.map +1 -0
- package/dist/utils/credentials.d.ts +11 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +47 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/enrichment-format.d.ts +31 -0
- package/dist/utils/enrichment-format.d.ts.map +1 -0
- package/dist/utils/enrichment-format.js +69 -0
- package/dist/utils/enrichment-format.js.map +1 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +29 -5
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/formatting.d.ts +1 -0
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +30 -2
- package/dist/utils/formatting.js.map +1 -1
- package/package.json +3 -1
- package/scripts/bundle-apps.ts +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/utils/confirmation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface StoredCredentials {
|
|
2
|
+
api_key: string;
|
|
3
|
+
email: string;
|
|
4
|
+
org_name: string;
|
|
5
|
+
authenticated_at: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getDefaultCredentialsPath(): string;
|
|
8
|
+
export declare function readCredentials(filePath?: string): StoredCredentials | null;
|
|
9
|
+
export declare function writeCredentials(filePath: string | undefined, credentials: StoredCredentials): void;
|
|
10
|
+
export declare function clearCredentials(filePath?: string): void;
|
|
11
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,wBAAgB,eAAe,CAC7B,QAAQ,GAAE,MAAiC,GAC1C,iBAAiB,GAAG,IAAI,CAqB1B;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,YAA2B,EAC3C,WAAW,EAAE,iBAAiB,GAC7B,IAAI,CAQN;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,GAAE,MAAiC,GAC1C,IAAI,CAMN"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { readFileSync, writeFileSync, unlinkSync, mkdirSync, chmodSync, } from "fs";
|
|
3
|
+
import { dirname, join } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
const DEFAULT_CREDENTIALS_PATH = join(homedir(), ".withpica", "credentials.json");
|
|
6
|
+
export function getDefaultCredentialsPath() {
|
|
7
|
+
return DEFAULT_CREDENTIALS_PATH;
|
|
8
|
+
}
|
|
9
|
+
export function readCredentials(filePath = DEFAULT_CREDENTIALS_PATH) {
|
|
10
|
+
try {
|
|
11
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
12
|
+
const parsed = JSON.parse(raw);
|
|
13
|
+
if (!parsed.api_key || typeof parsed.api_key !== "string") {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (!parsed.api_key.startsWith("withpica_live_")) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
api_key: parsed.api_key,
|
|
21
|
+
email: parsed.email || "",
|
|
22
|
+
org_name: parsed.org_name || "",
|
|
23
|
+
authenticated_at: parsed.authenticated_at || new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function writeCredentials(filePath = DEFAULT_CREDENTIALS_PATH, credentials) {
|
|
31
|
+
const dir = dirname(filePath);
|
|
32
|
+
mkdirSync(dir, { recursive: true });
|
|
33
|
+
writeFileSync(filePath, JSON.stringify(credentials, null, 2), {
|
|
34
|
+
mode: 0o600,
|
|
35
|
+
});
|
|
36
|
+
// Ensure permissions even if file existed
|
|
37
|
+
chmodSync(filePath, 0o600);
|
|
38
|
+
}
|
|
39
|
+
export function clearCredentials(filePath = DEFAULT_CREDENTIALS_PATH) {
|
|
40
|
+
try {
|
|
41
|
+
unlinkSync(filePath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// File doesn't exist — that's fine
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,SAAS,EACT,SAAS,GACV,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAS7B,MAAM,wBAAwB,GAAG,IAAI,CACnC,OAAO,EAAE,EACT,WAAW,EACX,kBAAkB,CACnB,CAAC;AAEF,MAAM,UAAU,yBAAyB;IACvC,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,WAAmB,wBAAwB;IAE3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,wBAAwB,EAC3C,WAA8B;IAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC5D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,0CAA0C;IAC1C,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,wBAAwB;IAE3C,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared enrichment result formatting utilities
|
|
3
|
+
*
|
|
4
|
+
* Detects whether an enrichment call actually found data and formats
|
|
5
|
+
* the response accordingly — matched / partial / no_match.
|
|
6
|
+
* Prevents tools from returning unconditional success messages when
|
|
7
|
+
* the API returned nothing. (ADR-149 Phase 2)
|
|
8
|
+
*/
|
|
9
|
+
import { ToolResult } from "../tools/index.js";
|
|
10
|
+
export type ResultQuality = "matched" | "partial" | "no_match";
|
|
11
|
+
/**
|
|
12
|
+
* Inspect the raw enrichment result and determine data quality.
|
|
13
|
+
*
|
|
14
|
+
* Resolution order:
|
|
15
|
+
* 1. If the API already set `result_quality`, trust it.
|
|
16
|
+
* 2. If `fieldsUpdated` is present, use count to decide.
|
|
17
|
+
* 3. If `writers`/`publishers` arrays are present (MLC shape), check emptiness.
|
|
18
|
+
* 4. If a non-empty `data` object is present, treat as matched.
|
|
19
|
+
* 5. Default to `partial` — better than falsely claiming "no match".
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectResultQuality(result: unknown): ResultQuality;
|
|
22
|
+
/**
|
|
23
|
+
* Build a ToolResult for an enrichment call with quality signalling.
|
|
24
|
+
*
|
|
25
|
+
* @param entityType "work" | "person"
|
|
26
|
+
* @param entityId The ID that was enriched
|
|
27
|
+
* @param source Display name of the source ("MLC", "MusicBrainz", "general", …)
|
|
28
|
+
* @param result Raw API response
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatEnrichmentResult(entityType: string, entityId: string, source: string, result: unknown): ToolResult;
|
|
31
|
+
//# sourceMappingURL=enrichment-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichment-format.d.ts","sourceRoot":"","sources":["../../src/utils/enrichment-format.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CA+BlE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,GACd,UAAU,CA0BZ"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
/**
|
|
3
|
+
* Inspect the raw enrichment result and determine data quality.
|
|
4
|
+
*
|
|
5
|
+
* Resolution order:
|
|
6
|
+
* 1. If the API already set `result_quality`, trust it.
|
|
7
|
+
* 2. If `fieldsUpdated` is present, use count to decide.
|
|
8
|
+
* 3. If `writers`/`publishers` arrays are present (MLC shape), check emptiness.
|
|
9
|
+
* 4. If a non-empty `data` object is present, treat as matched.
|
|
10
|
+
* 5. Default to `partial` — better than falsely claiming "no match".
|
|
11
|
+
*/
|
|
12
|
+
export function detectResultQuality(result) {
|
|
13
|
+
if (!result || typeof result !== "object")
|
|
14
|
+
return "no_match";
|
|
15
|
+
const r = result;
|
|
16
|
+
if (r.result_quality === "matched" || r.result_quality === "partial" || r.result_quality === "no_match") {
|
|
17
|
+
return r.result_quality;
|
|
18
|
+
}
|
|
19
|
+
if (typeof r.fieldsUpdated === "number") {
|
|
20
|
+
return r.fieldsUpdated > 0 ? "matched" : "no_match";
|
|
21
|
+
}
|
|
22
|
+
const hasWriters = Array.isArray(r.writers);
|
|
23
|
+
const hasPublishers = Array.isArray(r.publishers);
|
|
24
|
+
if (hasWriters || hasPublishers) {
|
|
25
|
+
const writersEmpty = hasWriters && r.writers.length === 0;
|
|
26
|
+
const publishersEmpty = hasPublishers && r.publishers.length === 0;
|
|
27
|
+
if ((hasWriters ? writersEmpty : true) &&
|
|
28
|
+
(hasPublishers ? publishersEmpty : true)) {
|
|
29
|
+
return "no_match";
|
|
30
|
+
}
|
|
31
|
+
return "matched";
|
|
32
|
+
}
|
|
33
|
+
if (r.data && typeof r.data === "object" && Object.keys(r.data).length > 0) {
|
|
34
|
+
return "matched";
|
|
35
|
+
}
|
|
36
|
+
return "partial";
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build a ToolResult for an enrichment call with quality signalling.
|
|
40
|
+
*
|
|
41
|
+
* @param entityType "work" | "person"
|
|
42
|
+
* @param entityId The ID that was enriched
|
|
43
|
+
* @param source Display name of the source ("MLC", "MusicBrainz", "general", …)
|
|
44
|
+
* @param result Raw API response
|
|
45
|
+
*/
|
|
46
|
+
export function formatEnrichmentResult(entityType, entityId, source, result) {
|
|
47
|
+
const quality = detectResultQuality(result);
|
|
48
|
+
const messages = {
|
|
49
|
+
matched: `${source} enrichment complete for ${entityType} ${entityId} — data found and applied`,
|
|
50
|
+
partial: `${source} enrichment complete for ${entityType} ${entityId} — some data found`,
|
|
51
|
+
no_match: `no ${source} match found for ${entityType} ${entityId}`,
|
|
52
|
+
};
|
|
53
|
+
const response = {
|
|
54
|
+
success: true,
|
|
55
|
+
message: messages[quality],
|
|
56
|
+
result_quality: quality,
|
|
57
|
+
data: result,
|
|
58
|
+
};
|
|
59
|
+
if (quality === "no_match") {
|
|
60
|
+
response.suggestion =
|
|
61
|
+
"try a different enrichment source for additional metadata";
|
|
62
|
+
}
|
|
63
|
+
const jsonText = JSON.stringify(response, null, 2);
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: `${response.message}\n\n${jsonText}` }],
|
|
66
|
+
structuredContent: response,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=enrichment-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichment-format.js","sourceRoot":"","sources":["../../src/utils/enrichment-format.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAe7D;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IAC7D,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QACxG,OAAO,CAAC,CAAC,cAA+B,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IACtD,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,UAAU,IAAK,CAAC,CAAC,OAAqB,CAAC,MAAM,KAAK,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,aAAa,IAAK,CAAC,CAAC,UAAwB,CAAC,MAAM,KAAK,CAAC,CAAC;QAClF,IACE,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;YAClC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,EACxC,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,QAAgB,EAChB,MAAc,EACd,MAAe;IAEf,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAkC;QAC9C,OAAO,EAAE,GAAG,MAAM,4BAA4B,UAAU,IAAI,QAAQ,2BAA2B;QAC/F,OAAO,EAAE,GAAG,MAAM,4BAA4B,UAAU,IAAI,QAAQ,oBAAoB;QACxF,QAAQ,EAAE,MAAM,MAAM,oBAAoB,UAAU,IAAI,QAAQ,EAAE;KACnE,CAAC;IAEF,MAAM,QAAQ,GAA4B;QACxC,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;QAC1B,cAAc,EAAE,OAAO;QACvB,IAAI,EAAE,MAAM;KACb,CAAC;IAEF,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,QAAQ,CAAC,UAAU;YACjB,2DAA2D,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,OAAO,QAAQ,EAAE,EAAE,CAAC;QACvE,iBAAiB,EAAE,QAAQ;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,GAAG;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,GAAG,YAAA;CAMvB;AAED,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,GAAE,MAAgC,EAAE,OAAO,CAAC,EAAE,GAAG;CAIrE;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,GAAG;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,GAAG,YAAA;CAMvB;AAED,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,GAAE,MAAgC,EAAE,OAAO,CAAC,EAAE,GAAG;CAIrE;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAwHtE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAc1D"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -35,6 +35,18 @@ export class ResourceError extends McpServerError {
|
|
|
35
35
|
* Format error for MCP response
|
|
36
36
|
*/
|
|
37
37
|
export function formatError(error) {
|
|
38
|
+
const status = error?.status;
|
|
39
|
+
const rawMessage = error instanceof Error ? error.message : error?.message || String(error);
|
|
40
|
+
// Attempt to parse structured error body from API responses
|
|
41
|
+
let structuredBody = null;
|
|
42
|
+
try {
|
|
43
|
+
if (typeof rawMessage === "string" && rawMessage.startsWith("{")) {
|
|
44
|
+
structuredBody = JSON.parse(rawMessage);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Not JSON — use raw message
|
|
49
|
+
}
|
|
38
50
|
if (error instanceof McpServerError) {
|
|
39
51
|
return {
|
|
40
52
|
type: "text",
|
|
@@ -42,11 +54,11 @@ export function formatError(error) {
|
|
|
42
54
|
error: error.code,
|
|
43
55
|
message: error.message,
|
|
44
56
|
details: error.details,
|
|
57
|
+
retry_safe: false,
|
|
45
58
|
}, null, 2),
|
|
46
59
|
};
|
|
47
60
|
}
|
|
48
61
|
// Classify ApiError from SDK layer
|
|
49
|
-
const status = error?.status;
|
|
50
62
|
if (status === 0 ||
|
|
51
63
|
(error instanceof Error && error.message?.includes("timed out"))) {
|
|
52
64
|
return {
|
|
@@ -54,6 +66,8 @@ export function formatError(error) {
|
|
|
54
66
|
text: JSON.stringify({
|
|
55
67
|
error: "REQUEST_TIMEOUT",
|
|
56
68
|
message: "API request timed out after retries. The server may be slow or unreachable.",
|
|
69
|
+
retry_safe: true,
|
|
70
|
+
suggestion: "wait a moment and try again",
|
|
57
71
|
}, null, 2),
|
|
58
72
|
};
|
|
59
73
|
}
|
|
@@ -64,6 +78,8 @@ export function formatError(error) {
|
|
|
64
78
|
error: "AUTHENTICATION_ERROR",
|
|
65
79
|
message: "API authentication failed. Check your PICA_API_KEY is valid.",
|
|
66
80
|
status,
|
|
81
|
+
retry_safe: false,
|
|
82
|
+
suggestion: "your API key may be invalid or expired — check your PICA settings",
|
|
67
83
|
}, null, 2),
|
|
68
84
|
};
|
|
69
85
|
}
|
|
@@ -74,23 +90,31 @@ export function formatError(error) {
|
|
|
74
90
|
error: "RATE_LIMITED",
|
|
75
91
|
message: "API rate limit exceeded after retries. Try again in a moment.",
|
|
76
92
|
status,
|
|
93
|
+
retry_safe: true,
|
|
94
|
+
suggestion: "wait a moment and try again",
|
|
77
95
|
}, null, 2),
|
|
78
96
|
};
|
|
79
97
|
}
|
|
80
|
-
|
|
98
|
+
// Structured error body from API — propagate domain-specific codes
|
|
99
|
+
if (structuredBody?.error_code) {
|
|
81
100
|
return {
|
|
82
101
|
type: "text",
|
|
83
102
|
text: JSON.stringify({
|
|
84
|
-
error:
|
|
85
|
-
message:
|
|
103
|
+
error: structuredBody.error_code,
|
|
104
|
+
message: structuredBody.message || rawMessage,
|
|
105
|
+
details: structuredBody.details,
|
|
106
|
+
retry_safe: false,
|
|
86
107
|
}, null, 2),
|
|
87
108
|
};
|
|
88
109
|
}
|
|
110
|
+
// Generic fallback
|
|
111
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
112
|
return {
|
|
90
113
|
type: "text",
|
|
91
114
|
text: JSON.stringify({
|
|
92
115
|
error: "UNKNOWN_ERROR",
|
|
93
|
-
message
|
|
116
|
+
message,
|
|
117
|
+
retry_safe: false,
|
|
94
118
|
}, null, 2),
|
|
95
119
|
};
|
|
96
120
|
}
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;GAEG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,UAAkB,uBAAuB,EAAE,OAAa;QAClE,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,cAAc;IAC/C,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gBACE,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,4 +60,5 @@ export declare function formatStructured(data: any, summary?: string): Formatted
|
|
|
60
60
|
* Format a list with both human summary and structured JSON
|
|
61
61
|
*/
|
|
62
62
|
export declare function formatStructuredList<T>(items: T[], entityName: string, metadata?: Record<string, any>): FormattedResult;
|
|
63
|
+
export declare function guardResponseSize(text: string, toolName: string): string;
|
|
63
64
|
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,CAQvD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC;CACtD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,GAAG,EACV,eAAe,CAAC,EAAE,cAAc,EAAE,GACjC,eAAe,CA0BjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,GAAG,EAAE,EACX,KAAK,GAAE,MAAU,GAChB,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,EAAE,EACV,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,eAAe,CAsBjB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,eAAe,CAWjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAW7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,eAAe,CAOjB;AAWD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkBxE"}
|
package/dist/utils/formatting.js
CHANGED
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
* Format data as JSON text for MCP response
|
|
4
4
|
*/
|
|
5
5
|
export function formatAsText(data) {
|
|
6
|
+
// Round-trip through JSON to ensure structuredContent is a plain object
|
|
7
|
+
// (raw API responses may contain class instances or Date objects that fail MCP validation)
|
|
8
|
+
const serialized = JSON.stringify(data, null, 2);
|
|
6
9
|
return {
|
|
7
|
-
content: [{ type: "text", text:
|
|
8
|
-
structuredContent:
|
|
10
|
+
content: [{ type: "text", text: serialized }],
|
|
11
|
+
structuredContent: JSON.parse(serialized),
|
|
9
12
|
};
|
|
10
13
|
}
|
|
11
14
|
/**
|
|
@@ -122,4 +125,29 @@ export function formatStructuredList(items, entityName, metadata) {
|
|
|
122
125
|
const summary = `Found ${count} ${entityName}${count !== 1 ? "s" : ""}${metadata?.query ? ` matching "${metadata.query}"` : ""}.`;
|
|
123
126
|
return formatStructured({ count, items, ...metadata }, summary);
|
|
124
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Guard against oversized tool responses that would blow the agent's context window.
|
|
130
|
+
* Block playbook: "Check byte size before returning text."
|
|
131
|
+
* Lowin: "Respect the token budget."
|
|
132
|
+
*
|
|
133
|
+
* Threshold: 100KB (~25K tokens). Truncates with recovery instructions.
|
|
134
|
+
*/
|
|
135
|
+
const MAX_RESPONSE_BYTES = 100_000;
|
|
136
|
+
export function guardResponseSize(text, toolName) {
|
|
137
|
+
const byteSize = Buffer.byteLength(text, "utf8");
|
|
138
|
+
if (byteSize <= MAX_RESPONSE_BYTES) {
|
|
139
|
+
return text;
|
|
140
|
+
}
|
|
141
|
+
// Truncate by chars (conservative — multi-byte chars mean fewer chars than bytes)
|
|
142
|
+
const truncated = text.substring(0, MAX_RESPONSE_BYTES);
|
|
143
|
+
const recovery = [
|
|
144
|
+
"\n\n---",
|
|
145
|
+
`TRUNCATED: Response from ${toolName} exceeded 100KB (was ${Math.round(byteSize / 1024)}KB).`,
|
|
146
|
+
"To get complete results, narrow your query:",
|
|
147
|
+
"- Use a smaller 'limit' parameter (e.g. limit=10)",
|
|
148
|
+
"- Add search/filter parameters to reduce results",
|
|
149
|
+
'- Use a more specific tool (e.g. pica_works_inspect with sections: ["basic"] instead of pica_works_query)',
|
|
150
|
+
].join("\n");
|
|
151
|
+
return truncated + recovery;
|
|
152
|
+
}
|
|
125
153
|
//# sourceMappingURL=formatting.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAc7D;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAS;IACpC,
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@withpica/mcp-server",
|
|
3
3
|
"mcpName": "io.github.withpica/pica",
|
|
4
|
-
"version": "2.5.
|
|
4
|
+
"version": "2.5.4",
|
|
5
5
|
"description": "MCP Server for PICA Platform - enables AI assistants to interact with PICA",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"pica-mcp": "./dist/index.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
|
+
"prebuild": "tsx scripts/bundle-apps.ts",
|
|
12
13
|
"build": "tsc",
|
|
13
14
|
"dev": "tsx src/index.ts",
|
|
14
15
|
"start": "node dist/index.js",
|
|
@@ -32,6 +33,7 @@
|
|
|
32
33
|
"mppx": "^0.5.0"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
36
|
+
"@modelcontextprotocol/ext-apps": "^1.5.0",
|
|
35
37
|
"@types/jest": "^29.5.14",
|
|
36
38
|
"@types/node": "^20.10.0",
|
|
37
39
|
"jest": "^29.7.0",
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Build script: reads font files + ext-apps browser bridge,
|
|
5
|
+
* writes src/apps/generated/shared-bundle.ts with const string exports.
|
|
6
|
+
* Run via: npm run prebuild (before tsc)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
10
|
+
import { join, dirname } from "path";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
12
|
+
import { createRequire } from "module";
|
|
13
|
+
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
const root = join(__dirname, "..");
|
|
17
|
+
|
|
18
|
+
// Read fonts as base64
|
|
19
|
+
const fontsDir = join(root, "assets/fonts");
|
|
20
|
+
const instrumentSerifRegular = readFileSync(
|
|
21
|
+
join(fontsDir, "InstrumentSerif-Regular.woff2"),
|
|
22
|
+
).toString("base64");
|
|
23
|
+
const instrumentSerifItalic = readFileSync(
|
|
24
|
+
join(fontsDir, "InstrumentSerif-Italic.woff2"),
|
|
25
|
+
).toString("base64");
|
|
26
|
+
const geistSansLight = readFileSync(
|
|
27
|
+
join(fontsDir, "GeistSans-Light.woff2"),
|
|
28
|
+
).toString("base64");
|
|
29
|
+
|
|
30
|
+
// Read ext-apps browser bridge bundle (devDependency — may not be installed in CI)
|
|
31
|
+
const require = createRequire(import.meta.url);
|
|
32
|
+
let appBridgeJs: string;
|
|
33
|
+
try {
|
|
34
|
+
const appBridgePath =
|
|
35
|
+
require.resolve("@modelcontextprotocol/ext-apps/app-with-deps");
|
|
36
|
+
appBridgeJs = readFileSync(appBridgePath, "utf-8");
|
|
37
|
+
} catch {
|
|
38
|
+
console.warn(
|
|
39
|
+
"[bundle-apps] @modelcontextprotocol/ext-apps not installed — writing stub (MCP Apps will not render)",
|
|
40
|
+
);
|
|
41
|
+
appBridgeJs = "/* ext-apps bridge not available */";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Write generated file
|
|
45
|
+
const outDir = join(root, "src/apps/generated");
|
|
46
|
+
mkdirSync(outDir, { recursive: true });
|
|
47
|
+
|
|
48
|
+
const output = `// Auto-generated by scripts/bundle-apps.ts — do not edit
|
|
49
|
+
// Re-run: npm run prebuild
|
|
50
|
+
|
|
51
|
+
export const INSTRUMENT_SERIF_REGULAR_BASE64 = "${instrumentSerifRegular}";
|
|
52
|
+
export const INSTRUMENT_SERIF_ITALIC_BASE64 = "${instrumentSerifItalic}";
|
|
53
|
+
export const GEIST_SANS_LIGHT_BASE64 = "${geistSansLight}";
|
|
54
|
+
export const APP_BRIDGE_JS = ${JSON.stringify(appBridgeJs)};
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
writeFileSync(join(outDir, "shared-bundle.ts"), output, "utf-8");
|
|
58
|
+
|
|
59
|
+
console.log(
|
|
60
|
+
`[bundle-apps] Generated shared-bundle.ts (${Math.round(output.length / 1024)}KB)`,
|
|
61
|
+
);
|