@browserstack/mcp-server 1.2.15-beta.2 → 1.2.16-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server-factory.js +0 -4
- package/dist/tools/percy-sdk.js +20 -11
- package/dist/tools/testmanagement-utils/get-testplan.d.ts +16 -0
- package/dist/tools/testmanagement-utils/get-testplan.js +99 -0
- package/dist/tools/testmanagement-utils/list-folders.d.ts +16 -0
- package/dist/tools/testmanagement-utils/list-folders.js +77 -0
- package/dist/tools/testmanagement-utils/list-testcases.js +1 -1
- package/dist/tools/testmanagement-utils/list-testplans.d.ts +15 -0
- package/dist/tools/testmanagement-utils/list-testplans.js +75 -0
- package/dist/tools/testmanagement-utils/update-testcase.d.ts +16 -0
- package/dist/tools/testmanagement-utils/update-testcase.js +133 -10
- package/dist/tools/testmanagement.d.ts +15 -0
- package/dist/tools/testmanagement.js +73 -2
- package/package.json +2 -3
- package/dist/lib/percy-api/auth.d.ts +0 -41
- package/dist/lib/percy-api/auth.js +0 -96
- package/dist/lib/percy-api/cache.d.ts +0 -28
- package/dist/lib/percy-api/cache.js +0 -48
- package/dist/lib/percy-api/client.d.ts +0 -69
- package/dist/lib/percy-api/client.js +0 -275
- package/dist/lib/percy-api/errors.d.ts +0 -15
- package/dist/lib/percy-api/errors.js +0 -52
- package/dist/lib/percy-api/formatter.d.ts +0 -16
- package/dist/lib/percy-api/formatter.js +0 -344
- package/dist/lib/percy-api/percy-auth.d.ts +0 -43
- package/dist/lib/percy-api/percy-auth.js +0 -137
- package/dist/lib/percy-api/percy-error-handler.d.ts +0 -24
- package/dist/lib/percy-api/percy-error-handler.js +0 -302
- package/dist/lib/percy-api/percy-session.d.ts +0 -42
- package/dist/lib/percy-api/percy-session.js +0 -87
- package/dist/lib/percy-api/polling.d.ts +0 -26
- package/dist/lib/percy-api/polling.js +0 -42
- package/dist/lib/percy-api/types.d.ts +0 -56
- package/dist/lib/percy-api/types.js +0 -76
- package/dist/tools/percy-mcp/advanced/branchline-operations.d.ts +0 -16
- package/dist/tools/percy-mcp/advanced/branchline-operations.js +0 -81
- package/dist/tools/percy-mcp/advanced/manage-variants.d.ts +0 -16
- package/dist/tools/percy-mcp/advanced/manage-variants.js +0 -155
- package/dist/tools/percy-mcp/advanced/manage-visual-monitoring.d.ts +0 -16
- package/dist/tools/percy-mcp/advanced/manage-visual-monitoring.js +0 -171
- package/dist/tools/percy-mcp/auth/auth-status.d.ts +0 -3
- package/dist/tools/percy-mcp/auth/auth-status.js +0 -131
- package/dist/tools/percy-mcp/core/approve-build.d.ts +0 -14
- package/dist/tools/percy-mcp/core/approve-build.js +0 -97
- package/dist/tools/percy-mcp/core/get-build-items.d.ts +0 -13
- package/dist/tools/percy-mcp/core/get-build-items.js +0 -65
- package/dist/tools/percy-mcp/core/get-build.d.ts +0 -10
- package/dist/tools/percy-mcp/core/get-build.js +0 -16
- package/dist/tools/percy-mcp/core/get-comparison.d.ts +0 -11
- package/dist/tools/percy-mcp/core/get-comparison.js +0 -59
- package/dist/tools/percy-mcp/core/get-snapshot.d.ts +0 -10
- package/dist/tools/percy-mcp/core/get-snapshot.js +0 -40
- package/dist/tools/percy-mcp/core/list-builds.d.ts +0 -14
- package/dist/tools/percy-mcp/core/list-builds.js +0 -45
- package/dist/tools/percy-mcp/core/list-projects.d.ts +0 -12
- package/dist/tools/percy-mcp/core/list-projects.js +0 -51
- package/dist/tools/percy-mcp/creation/create-app-snapshot.d.ts +0 -12
- package/dist/tools/percy-mcp/creation/create-app-snapshot.js +0 -29
- package/dist/tools/percy-mcp/creation/create-build.d.ts +0 -19
- package/dist/tools/percy-mcp/creation/create-build.js +0 -68
- package/dist/tools/percy-mcp/creation/create-comparison.d.ts +0 -18
- package/dist/tools/percy-mcp/creation/create-comparison.js +0 -90
- package/dist/tools/percy-mcp/creation/create-snapshot.d.ts +0 -17
- package/dist/tools/percy-mcp/creation/create-snapshot.js +0 -99
- package/dist/tools/percy-mcp/creation/finalize-build.d.ts +0 -12
- package/dist/tools/percy-mcp/creation/finalize-build.js +0 -33
- package/dist/tools/percy-mcp/creation/finalize-comparison.d.ts +0 -10
- package/dist/tools/percy-mcp/creation/finalize-comparison.js +0 -16
- package/dist/tools/percy-mcp/creation/finalize-snapshot.d.ts +0 -12
- package/dist/tools/percy-mcp/creation/finalize-snapshot.js +0 -33
- package/dist/tools/percy-mcp/creation/upload-resource.d.ts +0 -15
- package/dist/tools/percy-mcp/creation/upload-resource.js +0 -43
- package/dist/tools/percy-mcp/creation/upload-tile.d.ts +0 -11
- package/dist/tools/percy-mcp/creation/upload-tile.js +0 -53
- package/dist/tools/percy-mcp/diagnostics/analyze-logs-realtime.d.ts +0 -13
- package/dist/tools/percy-mcp/diagnostics/analyze-logs-realtime.js +0 -65
- package/dist/tools/percy-mcp/diagnostics/get-build-logs.d.ts +0 -17
- package/dist/tools/percy-mcp/diagnostics/get-build-logs.js +0 -74
- package/dist/tools/percy-mcp/diagnostics/get-network-logs.d.ts +0 -5
- package/dist/tools/percy-mcp/diagnostics/get-network-logs.js +0 -21
- package/dist/tools/percy-mcp/diagnostics/get-suggestions.d.ts +0 -7
- package/dist/tools/percy-mcp/diagnostics/get-suggestions.js +0 -24
- package/dist/tools/percy-mcp/index.d.ts +0 -36
- package/dist/tools/percy-mcp/index.js +0 -1137
- package/dist/tools/percy-mcp/intelligence/get-ai-analysis.d.ts +0 -15
- package/dist/tools/percy-mcp/intelligence/get-ai-analysis.js +0 -166
- package/dist/tools/percy-mcp/intelligence/get-ai-quota.d.ts +0 -9
- package/dist/tools/percy-mcp/intelligence/get-ai-quota.js +0 -73
- package/dist/tools/percy-mcp/intelligence/get-build-summary.d.ts +0 -11
- package/dist/tools/percy-mcp/intelligence/get-build-summary.js +0 -78
- package/dist/tools/percy-mcp/intelligence/get-rca.d.ts +0 -6
- package/dist/tools/percy-mcp/intelligence/get-rca.js +0 -153
- package/dist/tools/percy-mcp/intelligence/suggest-prompt.d.ts +0 -15
- package/dist/tools/percy-mcp/intelligence/suggest-prompt.js +0 -86
- package/dist/tools/percy-mcp/intelligence/trigger-ai-recompute.d.ts +0 -16
- package/dist/tools/percy-mcp/intelligence/trigger-ai-recompute.js +0 -64
- package/dist/tools/percy-mcp/management/create-project.d.ts +0 -14
- package/dist/tools/percy-mcp/management/create-project.js +0 -52
- package/dist/tools/percy-mcp/management/get-usage-stats.d.ts +0 -12
- package/dist/tools/percy-mcp/management/get-usage-stats.js +0 -61
- package/dist/tools/percy-mcp/management/manage-browser-targets.d.ts +0 -12
- package/dist/tools/percy-mcp/management/manage-browser-targets.js +0 -136
- package/dist/tools/percy-mcp/management/manage-comments.d.ts +0 -14
- package/dist/tools/percy-mcp/management/manage-comments.js +0 -147
- package/dist/tools/percy-mcp/management/manage-ignored-regions.d.ts +0 -18
- package/dist/tools/percy-mcp/management/manage-ignored-regions.js +0 -182
- package/dist/tools/percy-mcp/management/manage-project-settings.d.ts +0 -16
- package/dist/tools/percy-mcp/management/manage-project-settings.js +0 -97
- package/dist/tools/percy-mcp/management/manage-tokens.d.ts +0 -14
- package/dist/tools/percy-mcp/management/manage-tokens.js +0 -90
- package/dist/tools/percy-mcp/management/manage-webhooks.d.ts +0 -15
- package/dist/tools/percy-mcp/management/manage-webhooks.js +0 -180
- package/dist/tools/percy-mcp/v2/auth-status.d.ts +0 -3
- package/dist/tools/percy-mcp/v2/auth-status.js +0 -80
- package/dist/tools/percy-mcp/v2/clone-build.d.ts +0 -24
- package/dist/tools/percy-mcp/v2/clone-build.js +0 -539
- package/dist/tools/percy-mcp/v2/create-app-build.d.ts +0 -28
- package/dist/tools/percy-mcp/v2/create-app-build.js +0 -442
- package/dist/tools/percy-mcp/v2/create-build.d.ts +0 -16
- package/dist/tools/percy-mcp/v2/create-build.js +0 -601
- package/dist/tools/percy-mcp/v2/create-project.d.ts +0 -8
- package/dist/tools/percy-mcp/v2/create-project.js +0 -33
- package/dist/tools/percy-mcp/v2/discover-urls.d.ts +0 -7
- package/dist/tools/percy-mcp/v2/discover-urls.js +0 -38
- package/dist/tools/percy-mcp/v2/figma-baseline.d.ts +0 -7
- package/dist/tools/percy-mcp/v2/figma-baseline.js +0 -18
- package/dist/tools/percy-mcp/v2/figma-build.d.ts +0 -7
- package/dist/tools/percy-mcp/v2/figma-build.js +0 -39
- package/dist/tools/percy-mcp/v2/figma-link.d.ts +0 -6
- package/dist/tools/percy-mcp/v2/figma-link.js +0 -27
- package/dist/tools/percy-mcp/v2/get-ai-summary.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/get-ai-summary.js +0 -109
- package/dist/tools/percy-mcp/v2/get-build-detail.d.ts +0 -22
- package/dist/tools/percy-mcp/v2/get-build-detail.js +0 -567
- package/dist/tools/percy-mcp/v2/get-builds.d.ts +0 -8
- package/dist/tools/percy-mcp/v2/get-builds.js +0 -63
- package/dist/tools/percy-mcp/v2/get-comparison.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/get-comparison.js +0 -94
- package/dist/tools/percy-mcp/v2/get-devices.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/get-devices.js +0 -33
- package/dist/tools/percy-mcp/v2/get-insights.d.ts +0 -7
- package/dist/tools/percy-mcp/v2/get-insights.js +0 -52
- package/dist/tools/percy-mcp/v2/get-projects.d.ts +0 -6
- package/dist/tools/percy-mcp/v2/get-projects.js +0 -41
- package/dist/tools/percy-mcp/v2/get-snapshot.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/get-snapshot.js +0 -96
- package/dist/tools/percy-mcp/v2/get-test-case-history.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/get-test-case-history.js +0 -20
- package/dist/tools/percy-mcp/v2/get-test-cases.d.ts +0 -6
- package/dist/tools/percy-mcp/v2/get-test-cases.js +0 -36
- package/dist/tools/percy-mcp/v2/index.d.ts +0 -35
- package/dist/tools/percy-mcp/v2/index.js +0 -544
- package/dist/tools/percy-mcp/v2/list-integrations.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/list-integrations.js +0 -41
- package/dist/tools/percy-mcp/v2/manage-domains.d.ts +0 -8
- package/dist/tools/percy-mcp/v2/manage-domains.js +0 -33
- package/dist/tools/percy-mcp/v2/manage-insights-email.d.ts +0 -8
- package/dist/tools/percy-mcp/v2/manage-insights-email.js +0 -49
- package/dist/tools/percy-mcp/v2/manage-usage-alerts.d.ts +0 -10
- package/dist/tools/percy-mcp/v2/manage-usage-alerts.js +0 -43
- package/dist/tools/percy-mcp/v2/migrate-integrations.d.ts +0 -6
- package/dist/tools/percy-mcp/v2/migrate-integrations.js +0 -20
- package/dist/tools/percy-mcp/v2/preview-comparison.d.ts +0 -5
- package/dist/tools/percy-mcp/v2/preview-comparison.js +0 -17
- package/dist/tools/percy-mcp/v2/search-build-items.d.ts +0 -12
- package/dist/tools/percy-mcp/v2/search-build-items.js +0 -45
- package/dist/tools/percy-mcp/workflows/auto-triage.d.ts +0 -7
- package/dist/tools/percy-mcp/workflows/auto-triage.js +0 -82
- package/dist/tools/percy-mcp/workflows/clone-build.d.ts +0 -22
- package/dist/tools/percy-mcp/workflows/clone-build.js +0 -414
- package/dist/tools/percy-mcp/workflows/create-percy-build.d.ts +0 -32
- package/dist/tools/percy-mcp/workflows/create-percy-build.js +0 -434
- package/dist/tools/percy-mcp/workflows/debug-failed-build.d.ts +0 -5
- package/dist/tools/percy-mcp/workflows/debug-failed-build.js +0 -122
- package/dist/tools/percy-mcp/workflows/diff-explain.d.ts +0 -6
- package/dist/tools/percy-mcp/workflows/diff-explain.js +0 -147
- package/dist/tools/percy-mcp/workflows/pr-visual-report.d.ts +0 -8
- package/dist/tools/percy-mcp/workflows/pr-visual-report.js +0 -184
- package/dist/tools/percy-mcp/workflows/run-tests.d.ts +0 -17
- package/dist/tools/percy-mcp/workflows/run-tests.js +0 -107
- package/dist/tools/percy-mcp/workflows/snapshot-urls.d.ts +0 -18
- package/dist/tools/percy-mcp/workflows/snapshot-urls.js +0 -197
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_create_snapshot — Create a snapshot in a Percy build with DOM resources.
|
|
3
|
-
*
|
|
4
|
-
* POST /builds/{build_id}/snapshots with JSON:API body.
|
|
5
|
-
* Returns snapshot ID and list of missing resources for upload.
|
|
6
|
-
*/
|
|
7
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
8
|
-
export async function percyCreateSnapshot(args, config) {
|
|
9
|
-
const { build_id, name, widths, enable_javascript, resources } = args;
|
|
10
|
-
// Parse widths from comma-separated string to int array
|
|
11
|
-
const parsedWidths = widths
|
|
12
|
-
? widths
|
|
13
|
-
.split(",")
|
|
14
|
-
.map((w) => parseInt(w.trim(), 10))
|
|
15
|
-
.filter((w) => !isNaN(w))
|
|
16
|
-
: undefined;
|
|
17
|
-
// Parse resources from JSON string
|
|
18
|
-
let parsedResources;
|
|
19
|
-
if (resources) {
|
|
20
|
-
try {
|
|
21
|
-
parsedResources = JSON.parse(resources);
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return {
|
|
25
|
-
content: [
|
|
26
|
-
{
|
|
27
|
-
type: "text",
|
|
28
|
-
text: `Invalid resources JSON: could not parse the provided string.`,
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
isError: true,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
const attributes = { name };
|
|
36
|
-
if (parsedWidths) {
|
|
37
|
-
attributes.widths = parsedWidths;
|
|
38
|
-
}
|
|
39
|
-
if (enable_javascript !== undefined) {
|
|
40
|
-
attributes["enable-javascript"] = enable_javascript;
|
|
41
|
-
}
|
|
42
|
-
const body = {
|
|
43
|
-
data: {
|
|
44
|
-
type: "snapshots",
|
|
45
|
-
attributes,
|
|
46
|
-
relationships: {
|
|
47
|
-
...(parsedResources
|
|
48
|
-
? {
|
|
49
|
-
resources: {
|
|
50
|
-
data: parsedResources.map((r) => ({
|
|
51
|
-
type: "resources",
|
|
52
|
-
id: r.id,
|
|
53
|
-
attributes: {
|
|
54
|
-
"resource-url": r["resource-url"],
|
|
55
|
-
"is-root": r["is-root"] ?? false,
|
|
56
|
-
},
|
|
57
|
-
})),
|
|
58
|
-
},
|
|
59
|
-
}
|
|
60
|
-
: {}),
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
try {
|
|
65
|
-
const client = new PercyClient(config);
|
|
66
|
-
const result = (await client.post(`/builds/${build_id}/snapshots`, body));
|
|
67
|
-
const snapshotId = result?.data?.id ?? "unknown";
|
|
68
|
-
// Extract missing resources from relationships
|
|
69
|
-
const missingResources = result?.data?.missingResources ?? [];
|
|
70
|
-
const missingCount = Array.isArray(missingResources)
|
|
71
|
-
? missingResources.length
|
|
72
|
-
: 0;
|
|
73
|
-
const missingShas = Array.isArray(missingResources)
|
|
74
|
-
? missingResources.map((r) => r.id ?? r).join(", ")
|
|
75
|
-
: "";
|
|
76
|
-
const lines = [
|
|
77
|
-
`Snapshot '${name}' created (ID: ${snapshotId}). Missing resources: ${missingCount}.`,
|
|
78
|
-
];
|
|
79
|
-
if (missingCount > 0) {
|
|
80
|
-
lines.push(`Upload them with percy_upload_resource.`);
|
|
81
|
-
lines.push(`Missing SHAs: ${missingShas}`);
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
content: [{ type: "text", text: lines.join(" ") }],
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
-
return {
|
|
90
|
-
content: [
|
|
91
|
-
{
|
|
92
|
-
type: "text",
|
|
93
|
-
text: `Failed to create snapshot '${name}' in build ${build_id}: ${message}`,
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
isError: true,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_finalize_build — Finalize a Percy build after all snapshots are complete.
|
|
3
|
-
*
|
|
4
|
-
* POST /builds/{build_id}/finalize — triggers processing.
|
|
5
|
-
*/
|
|
6
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
7
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
-
interface FinalizeBuildArgs {
|
|
9
|
-
build_id: string;
|
|
10
|
-
}
|
|
11
|
-
export declare function percyFinalizeBuild(args: FinalizeBuildArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
12
|
-
export {};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_finalize_build — Finalize a Percy build after all snapshots are complete.
|
|
3
|
-
*
|
|
4
|
-
* POST /builds/{build_id}/finalize — triggers processing.
|
|
5
|
-
*/
|
|
6
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
7
|
-
export async function percyFinalizeBuild(args, config) {
|
|
8
|
-
const { build_id } = args;
|
|
9
|
-
try {
|
|
10
|
-
const client = new PercyClient(config);
|
|
11
|
-
await client.post(`/builds/${build_id}/finalize`);
|
|
12
|
-
return {
|
|
13
|
-
content: [
|
|
14
|
-
{
|
|
15
|
-
type: "text",
|
|
16
|
-
text: `Build ${build_id} finalized. Processing will begin.`,
|
|
17
|
-
},
|
|
18
|
-
],
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
22
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
23
|
-
return {
|
|
24
|
-
content: [
|
|
25
|
-
{
|
|
26
|
-
type: "text",
|
|
27
|
-
text: `Failed to finalize build ${build_id}: ${message}`,
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
isError: true,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_finalize_comparison — Finalize a Percy comparison after all tiles are uploaded.
|
|
3
|
-
*/
|
|
4
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
5
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
-
interface FinalizeComparisonArgs {
|
|
7
|
-
comparison_id: string;
|
|
8
|
-
}
|
|
9
|
-
export declare function percyFinalizeComparison(args: FinalizeComparisonArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
10
|
-
export {};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_finalize_comparison — Finalize a Percy comparison after all tiles are uploaded.
|
|
3
|
-
*/
|
|
4
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
5
|
-
export async function percyFinalizeComparison(args, config) {
|
|
6
|
-
const client = new PercyClient(config, { scope: "auto" });
|
|
7
|
-
await client.post(`/comparisons/${args.comparison_id}/finalize`);
|
|
8
|
-
return {
|
|
9
|
-
content: [
|
|
10
|
-
{
|
|
11
|
-
type: "text",
|
|
12
|
-
text: `Comparison ${args.comparison_id} finalized. Diff processing will begin.`,
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
};
|
|
16
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_finalize_snapshot — Finalize a Percy snapshot after all resources are uploaded.
|
|
3
|
-
*
|
|
4
|
-
* POST /snapshots/{snapshot_id}/finalize — triggers rendering.
|
|
5
|
-
*/
|
|
6
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
7
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
-
interface FinalizeSnapshotArgs {
|
|
9
|
-
snapshot_id: string;
|
|
10
|
-
}
|
|
11
|
-
export declare function percyFinalizeSnapshot(args: FinalizeSnapshotArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
12
|
-
export {};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_finalize_snapshot — Finalize a Percy snapshot after all resources are uploaded.
|
|
3
|
-
*
|
|
4
|
-
* POST /snapshots/{snapshot_id}/finalize — triggers rendering.
|
|
5
|
-
*/
|
|
6
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
7
|
-
export async function percyFinalizeSnapshot(args, config) {
|
|
8
|
-
const { snapshot_id } = args;
|
|
9
|
-
try {
|
|
10
|
-
const client = new PercyClient(config);
|
|
11
|
-
await client.post(`/snapshots/${snapshot_id}/finalize`);
|
|
12
|
-
return {
|
|
13
|
-
content: [
|
|
14
|
-
{
|
|
15
|
-
type: "text",
|
|
16
|
-
text: `Snapshot ${snapshot_id} finalized. Rendering will begin.`,
|
|
17
|
-
},
|
|
18
|
-
],
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
22
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
23
|
-
return {
|
|
24
|
-
content: [
|
|
25
|
-
{
|
|
26
|
-
type: "text",
|
|
27
|
-
text: `Failed to finalize snapshot ${snapshot_id}: ${message}`,
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
isError: true,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_upload_resource — Upload a resource to a Percy build.
|
|
3
|
-
*
|
|
4
|
-
* POST /builds/{build_id}/resources with JSON:API body.
|
|
5
|
-
* Percy API validates SHA matches content server-side.
|
|
6
|
-
*/
|
|
7
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
8
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
9
|
-
interface UploadResourceArgs {
|
|
10
|
-
build_id: string;
|
|
11
|
-
sha: string;
|
|
12
|
-
base64_content: string;
|
|
13
|
-
}
|
|
14
|
-
export declare function percyUploadResource(args: UploadResourceArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
15
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_upload_resource — Upload a resource to a Percy build.
|
|
3
|
-
*
|
|
4
|
-
* POST /builds/{build_id}/resources with JSON:API body.
|
|
5
|
-
* Percy API validates SHA matches content server-side.
|
|
6
|
-
*/
|
|
7
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
8
|
-
export async function percyUploadResource(args, config) {
|
|
9
|
-
const { build_id, sha, base64_content } = args;
|
|
10
|
-
const body = {
|
|
11
|
-
data: {
|
|
12
|
-
type: "resources",
|
|
13
|
-
id: sha,
|
|
14
|
-
attributes: {
|
|
15
|
-
"base64-content": base64_content,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
try {
|
|
20
|
-
const client = new PercyClient(config);
|
|
21
|
-
await client.post(`/builds/${build_id}/resources`, body);
|
|
22
|
-
return {
|
|
23
|
-
content: [
|
|
24
|
-
{
|
|
25
|
-
type: "text",
|
|
26
|
-
text: `Resource ${sha} uploaded successfully.`,
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
33
|
-
return {
|
|
34
|
-
content: [
|
|
35
|
-
{
|
|
36
|
-
type: "text",
|
|
37
|
-
text: `Failed to upload resource ${sha} to build ${build_id}: ${message}`,
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
isError: true,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_upload_tile — Upload a screenshot tile (PNG or JPEG) to a Percy comparison.
|
|
3
|
-
*/
|
|
4
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
5
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
-
interface UploadTileArgs {
|
|
7
|
-
comparison_id: string;
|
|
8
|
-
base64_content: string;
|
|
9
|
-
}
|
|
10
|
-
export declare function percyUploadTile(args: UploadTileArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
11
|
-
export {};
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_upload_tile — Upload a screenshot tile (PNG or JPEG) to a Percy comparison.
|
|
3
|
-
*/
|
|
4
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
5
|
-
// PNG magic bytes: 0x89 0x50 0x4E 0x47
|
|
6
|
-
const PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47];
|
|
7
|
-
// JPEG magic bytes: 0xFF 0xD8 0xFF
|
|
8
|
-
const JPEG_MAGIC = [0xff, 0xd8, 0xff];
|
|
9
|
-
function isValidImage(base64) {
|
|
10
|
-
try {
|
|
11
|
-
const buffer = Buffer.from(base64, "base64");
|
|
12
|
-
if (buffer.length < 4)
|
|
13
|
-
return false;
|
|
14
|
-
const isPng = PNG_MAGIC.every((byte, i) => buffer[i] === byte);
|
|
15
|
-
const isJpeg = JPEG_MAGIC.every((byte, i) => buffer[i] === byte);
|
|
16
|
-
return isPng || isJpeg;
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export async function percyUploadTile(args, config) {
|
|
23
|
-
// Validate image format
|
|
24
|
-
if (!isValidImage(args.base64_content)) {
|
|
25
|
-
return {
|
|
26
|
-
content: [
|
|
27
|
-
{
|
|
28
|
-
type: "text",
|
|
29
|
-
text: "Only PNG and JPEG images are supported",
|
|
30
|
-
},
|
|
31
|
-
],
|
|
32
|
-
isError: true,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
const client = new PercyClient(config, { scope: "auto" });
|
|
36
|
-
const body = {
|
|
37
|
-
data: {
|
|
38
|
-
type: "tiles",
|
|
39
|
-
attributes: {
|
|
40
|
-
"base64-content": args.base64_content,
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
await client.post(`/comparisons/${args.comparison_id}/tiles`, body);
|
|
45
|
-
return {
|
|
46
|
-
content: [
|
|
47
|
-
{
|
|
48
|
-
type: "text",
|
|
49
|
-
text: `Tile uploaded to comparison ${args.comparison_id}.`,
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_analyze_logs_realtime — Analyze raw log data in real-time.
|
|
3
|
-
*
|
|
4
|
-
* Accepts a JSON array of log entries, sends them to Percy's suggestion
|
|
5
|
-
* engine, and returns instant diagnostics with fix suggestions.
|
|
6
|
-
*/
|
|
7
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
8
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
9
|
-
interface AnalyzeLogsRealtimeArgs {
|
|
10
|
-
logs: string;
|
|
11
|
-
}
|
|
12
|
-
export declare function percyAnalyzeLogsRealtime(args: AnalyzeLogsRealtimeArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
13
|
-
export {};
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_analyze_logs_realtime — Analyze raw log data in real-time.
|
|
3
|
-
*
|
|
4
|
-
* Accepts a JSON array of log entries, sends them to Percy's suggestion
|
|
5
|
-
* engine, and returns instant diagnostics with fix suggestions.
|
|
6
|
-
*/
|
|
7
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
8
|
-
import { formatSuggestions } from "../../../lib/percy-api/formatter.js";
|
|
9
|
-
export async function percyAnalyzeLogsRealtime(args, config) {
|
|
10
|
-
const client = new PercyClient(config);
|
|
11
|
-
let logEntries;
|
|
12
|
-
try {
|
|
13
|
-
logEntries = JSON.parse(args.logs);
|
|
14
|
-
if (!Array.isArray(logEntries)) {
|
|
15
|
-
return {
|
|
16
|
-
content: [
|
|
17
|
-
{
|
|
18
|
-
type: "text",
|
|
19
|
-
text: "logs must be a JSON array of log entries.",
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
isError: true,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return {
|
|
28
|
-
content: [
|
|
29
|
-
{
|
|
30
|
-
type: "text",
|
|
31
|
-
text: "Invalid JSON in logs parameter. Provide a JSON array of log entries.",
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
isError: true,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
const body = {
|
|
38
|
-
data: {
|
|
39
|
-
logs: logEntries,
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
try {
|
|
43
|
-
const result = await client.post("/suggestions/from_logs", body);
|
|
44
|
-
if (!result || (Array.isArray(result) && result.length === 0)) {
|
|
45
|
-
return {
|
|
46
|
-
content: [
|
|
47
|
-
{
|
|
48
|
-
type: "text",
|
|
49
|
-
text: "No issues detected in the provided logs.",
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
const suggestions = Array.isArray(result) ? result : [result];
|
|
55
|
-
const output = "## Real-Time Log Analysis\n\n" + formatSuggestions(suggestions);
|
|
56
|
-
return { content: [{ type: "text", text: output }] };
|
|
57
|
-
}
|
|
58
|
-
catch (e) {
|
|
59
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
60
|
-
return {
|
|
61
|
-
content: [{ type: "text", text: `Log analysis failed: ${message}` }],
|
|
62
|
-
isError: true,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_get_build_logs — Download and filter Percy build logs.
|
|
3
|
-
*
|
|
4
|
-
* Retrieves logs for a build, optionally filtered by service (cli, renderer,
|
|
5
|
-
* jackproxy), reference scope, and log level.
|
|
6
|
-
*/
|
|
7
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
8
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
9
|
-
interface GetBuildLogsArgs {
|
|
10
|
-
build_id: string;
|
|
11
|
-
service?: string;
|
|
12
|
-
reference_type?: string;
|
|
13
|
-
reference_id?: string;
|
|
14
|
-
level?: string;
|
|
15
|
-
}
|
|
16
|
-
export declare function percyGetBuildLogs(args: GetBuildLogsArgs, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
17
|
-
export {};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* percy_get_build_logs — Download and filter Percy build logs.
|
|
3
|
-
*
|
|
4
|
-
* Retrieves logs for a build, optionally filtered by service (cli, renderer,
|
|
5
|
-
* jackproxy), reference scope, and log level.
|
|
6
|
-
*/
|
|
7
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
8
|
-
export async function percyGetBuildLogs(args, config) {
|
|
9
|
-
const client = new PercyClient(config);
|
|
10
|
-
const params = { build_id: args.build_id };
|
|
11
|
-
if (args.service)
|
|
12
|
-
params.service_name = args.service;
|
|
13
|
-
if (args.reference_type && args.reference_id) {
|
|
14
|
-
params.reference_id = `${args.reference_type}_${args.reference_id}`;
|
|
15
|
-
}
|
|
16
|
-
let data;
|
|
17
|
-
try {
|
|
18
|
-
data = await client.get("/logs", params);
|
|
19
|
-
}
|
|
20
|
-
catch (e) {
|
|
21
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
22
|
-
return {
|
|
23
|
-
content: [{ type: "text", text: `Failed to fetch logs: ${message}` }],
|
|
24
|
-
isError: true,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
if (!data) {
|
|
28
|
-
return {
|
|
29
|
-
content: [{ type: "text", text: "No logs available for this build." }],
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
let output = `## Build Logs — #${args.build_id}\n\n`;
|
|
33
|
-
if (args.service)
|
|
34
|
-
output += `**Service:** ${args.service}\n`;
|
|
35
|
-
if (args.level)
|
|
36
|
-
output += `**Level filter:** ${args.level}\n`;
|
|
37
|
-
output += "\n";
|
|
38
|
-
// Parse log data — format depends on service
|
|
39
|
-
const record = data;
|
|
40
|
-
const rendererLogs = record?.renderer;
|
|
41
|
-
const rawLogs = Array.isArray(data)
|
|
42
|
-
? data
|
|
43
|
-
: record?.logs ||
|
|
44
|
-
record?.clilogs ||
|
|
45
|
-
rendererLogs?.logs ||
|
|
46
|
-
[];
|
|
47
|
-
const logs = Array.isArray(rawLogs) ? rawLogs : [];
|
|
48
|
-
if (logs.length > 0) {
|
|
49
|
-
const filtered = args.level
|
|
50
|
-
? logs.filter((l) => {
|
|
51
|
-
const entry = l;
|
|
52
|
-
return entry.level === args.level || entry.debug === args.level;
|
|
53
|
-
})
|
|
54
|
-
: logs;
|
|
55
|
-
output += "```\n";
|
|
56
|
-
filtered.slice(0, 100).forEach((log) => {
|
|
57
|
-
const entry = log;
|
|
58
|
-
const ts = entry.timestamp ? `[${entry.timestamp}] ` : "";
|
|
59
|
-
const level = (entry.level || entry.debug || "");
|
|
60
|
-
const msg = entry.message ||
|
|
61
|
-
entry.msg ||
|
|
62
|
-
JSON.stringify(entry);
|
|
63
|
-
output += `${ts}${level ? level.toUpperCase() + " " : ""}${msg}\n`;
|
|
64
|
-
});
|
|
65
|
-
if (filtered.length > 100) {
|
|
66
|
-
output += `\n... (${filtered.length - 100} more log entries)\n`;
|
|
67
|
-
}
|
|
68
|
-
output += "```\n";
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
output += "No log entries found matching filters.\n";
|
|
72
|
-
}
|
|
73
|
-
return { content: [{ type: "text", text: output }] };
|
|
74
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
2
|
-
import { formatNetworkLogs } from "../../../lib/percy-api/formatter.js";
|
|
3
|
-
export async function percyGetNetworkLogs(args, config) {
|
|
4
|
-
const client = new PercyClient(config);
|
|
5
|
-
const data = await client.get("/network-logs", {
|
|
6
|
-
comparison_id: args.comparison_id,
|
|
7
|
-
});
|
|
8
|
-
if (!data || (Array.isArray(data) && data.length === 0)) {
|
|
9
|
-
return {
|
|
10
|
-
content: [
|
|
11
|
-
{
|
|
12
|
-
type: "text",
|
|
13
|
-
text: "No network requests recorded for this comparison.",
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
const logs = Array.isArray(data) ? data : Object.values(data);
|
|
19
|
-
const output = formatNetworkLogs(logs);
|
|
20
|
-
return { content: [{ type: "text", text: output }] };
|
|
21
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { BrowserStackConfig } from "../../../lib/types.js";
|
|
2
|
-
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
-
export declare function percyGetSuggestions(args: {
|
|
4
|
-
build_id: string;
|
|
5
|
-
reference_type?: string;
|
|
6
|
-
reference_id?: string;
|
|
7
|
-
}, config: BrowserStackConfig): Promise<CallToolResult>;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { PercyClient } from "../../../lib/percy-api/client.js";
|
|
2
|
-
import { formatSuggestions } from "../../../lib/percy-api/formatter.js";
|
|
3
|
-
export async function percyGetSuggestions(args, config) {
|
|
4
|
-
const client = new PercyClient(config);
|
|
5
|
-
const params = { build_id: args.build_id };
|
|
6
|
-
if (args.reference_type)
|
|
7
|
-
params.reference_type = args.reference_type;
|
|
8
|
-
if (args.reference_id)
|
|
9
|
-
params.reference_id = args.reference_id;
|
|
10
|
-
const data = await client.get("/suggestions", params);
|
|
11
|
-
if (!data || (Array.isArray(data) && data.length === 0)) {
|
|
12
|
-
return {
|
|
13
|
-
content: [
|
|
14
|
-
{
|
|
15
|
-
type: "text",
|
|
16
|
-
text: "No diagnostic suggestions available for this build.",
|
|
17
|
-
},
|
|
18
|
-
],
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
const suggestions = Array.isArray(data) ? data : [data];
|
|
22
|
-
const output = formatSuggestions(suggestions);
|
|
23
|
-
return { content: [{ type: "text", text: output }] };
|
|
24
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Percy MCP tools — CRUD-organized tools for Percy visual testing.
|
|
3
|
-
*
|
|
4
|
-
* Registers 41 tools organized by CRUD action:
|
|
5
|
-
*
|
|
6
|
-
* === CREATE (6) ===
|
|
7
|
-
* percy_create_project, percy_create_percy_build, percy_create_build,
|
|
8
|
-
* percy_create_snapshot, percy_create_app_snapshot, percy_create_comparison
|
|
9
|
-
*
|
|
10
|
-
* === READ (17) ===
|
|
11
|
-
* percy_list_projects, percy_list_builds, percy_get_build,
|
|
12
|
-
* percy_get_build_items, percy_get_snapshot, percy_get_comparison,
|
|
13
|
-
* percy_get_ai_analysis, percy_get_build_summary, percy_get_ai_quota,
|
|
14
|
-
* percy_get_rca, percy_get_suggestions, percy_get_network_logs,
|
|
15
|
-
* percy_get_build_logs, percy_get_usage_stats, percy_auth_status
|
|
16
|
-
*
|
|
17
|
-
* === UPDATE (12) ===
|
|
18
|
-
* percy_approve_build, percy_manage_project_settings,
|
|
19
|
-
* percy_manage_browser_targets, percy_manage_tokens,
|
|
20
|
-
* percy_manage_webhooks, percy_manage_ignored_regions,
|
|
21
|
-
* percy_manage_comments, percy_manage_variants,
|
|
22
|
-
* percy_manage_visual_monitoring, percy_trigger_ai_recompute,
|
|
23
|
-
* percy_suggest_prompt, percy_branchline_operations
|
|
24
|
-
*
|
|
25
|
-
* === FINALIZE / UPLOAD (6) ===
|
|
26
|
-
* percy_finalize_build, percy_finalize_snapshot, percy_finalize_comparison,
|
|
27
|
-
* percy_upload_resource, percy_upload_tile, percy_analyze_logs_realtime
|
|
28
|
-
*
|
|
29
|
-
* === WORKFLOWS (4) ===
|
|
30
|
-
* percy_pr_visual_report, percy_auto_triage,
|
|
31
|
-
* percy_debug_failed_build, percy_diff_explain
|
|
32
|
-
*/
|
|
33
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
34
|
-
import { BrowserStackConfig } from "../../lib/types.js";
|
|
35
|
-
export declare function registerPercyMcpTools(server: McpServer, config: BrowserStackConfig): Record<string, any>;
|
|
36
|
-
export default registerPercyMcpTools;
|