@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.
Files changed (182) hide show
  1. package/dist/server-factory.js +0 -4
  2. package/dist/tools/percy-sdk.js +20 -11
  3. package/dist/tools/testmanagement-utils/get-testplan.d.ts +16 -0
  4. package/dist/tools/testmanagement-utils/get-testplan.js +99 -0
  5. package/dist/tools/testmanagement-utils/list-folders.d.ts +16 -0
  6. package/dist/tools/testmanagement-utils/list-folders.js +77 -0
  7. package/dist/tools/testmanagement-utils/list-testcases.js +1 -1
  8. package/dist/tools/testmanagement-utils/list-testplans.d.ts +15 -0
  9. package/dist/tools/testmanagement-utils/list-testplans.js +75 -0
  10. package/dist/tools/testmanagement-utils/update-testcase.d.ts +16 -0
  11. package/dist/tools/testmanagement-utils/update-testcase.js +133 -10
  12. package/dist/tools/testmanagement.d.ts +15 -0
  13. package/dist/tools/testmanagement.js +73 -2
  14. package/package.json +2 -3
  15. package/dist/lib/percy-api/auth.d.ts +0 -41
  16. package/dist/lib/percy-api/auth.js +0 -96
  17. package/dist/lib/percy-api/cache.d.ts +0 -28
  18. package/dist/lib/percy-api/cache.js +0 -48
  19. package/dist/lib/percy-api/client.d.ts +0 -69
  20. package/dist/lib/percy-api/client.js +0 -275
  21. package/dist/lib/percy-api/errors.d.ts +0 -15
  22. package/dist/lib/percy-api/errors.js +0 -52
  23. package/dist/lib/percy-api/formatter.d.ts +0 -16
  24. package/dist/lib/percy-api/formatter.js +0 -344
  25. package/dist/lib/percy-api/percy-auth.d.ts +0 -43
  26. package/dist/lib/percy-api/percy-auth.js +0 -137
  27. package/dist/lib/percy-api/percy-error-handler.d.ts +0 -24
  28. package/dist/lib/percy-api/percy-error-handler.js +0 -302
  29. package/dist/lib/percy-api/percy-session.d.ts +0 -42
  30. package/dist/lib/percy-api/percy-session.js +0 -87
  31. package/dist/lib/percy-api/polling.d.ts +0 -26
  32. package/dist/lib/percy-api/polling.js +0 -42
  33. package/dist/lib/percy-api/types.d.ts +0 -56
  34. package/dist/lib/percy-api/types.js +0 -76
  35. package/dist/tools/percy-mcp/advanced/branchline-operations.d.ts +0 -16
  36. package/dist/tools/percy-mcp/advanced/branchline-operations.js +0 -81
  37. package/dist/tools/percy-mcp/advanced/manage-variants.d.ts +0 -16
  38. package/dist/tools/percy-mcp/advanced/manage-variants.js +0 -155
  39. package/dist/tools/percy-mcp/advanced/manage-visual-monitoring.d.ts +0 -16
  40. package/dist/tools/percy-mcp/advanced/manage-visual-monitoring.js +0 -171
  41. package/dist/tools/percy-mcp/auth/auth-status.d.ts +0 -3
  42. package/dist/tools/percy-mcp/auth/auth-status.js +0 -131
  43. package/dist/tools/percy-mcp/core/approve-build.d.ts +0 -14
  44. package/dist/tools/percy-mcp/core/approve-build.js +0 -97
  45. package/dist/tools/percy-mcp/core/get-build-items.d.ts +0 -13
  46. package/dist/tools/percy-mcp/core/get-build-items.js +0 -65
  47. package/dist/tools/percy-mcp/core/get-build.d.ts +0 -10
  48. package/dist/tools/percy-mcp/core/get-build.js +0 -16
  49. package/dist/tools/percy-mcp/core/get-comparison.d.ts +0 -11
  50. package/dist/tools/percy-mcp/core/get-comparison.js +0 -59
  51. package/dist/tools/percy-mcp/core/get-snapshot.d.ts +0 -10
  52. package/dist/tools/percy-mcp/core/get-snapshot.js +0 -40
  53. package/dist/tools/percy-mcp/core/list-builds.d.ts +0 -14
  54. package/dist/tools/percy-mcp/core/list-builds.js +0 -45
  55. package/dist/tools/percy-mcp/core/list-projects.d.ts +0 -12
  56. package/dist/tools/percy-mcp/core/list-projects.js +0 -51
  57. package/dist/tools/percy-mcp/creation/create-app-snapshot.d.ts +0 -12
  58. package/dist/tools/percy-mcp/creation/create-app-snapshot.js +0 -29
  59. package/dist/tools/percy-mcp/creation/create-build.d.ts +0 -19
  60. package/dist/tools/percy-mcp/creation/create-build.js +0 -68
  61. package/dist/tools/percy-mcp/creation/create-comparison.d.ts +0 -18
  62. package/dist/tools/percy-mcp/creation/create-comparison.js +0 -90
  63. package/dist/tools/percy-mcp/creation/create-snapshot.d.ts +0 -17
  64. package/dist/tools/percy-mcp/creation/create-snapshot.js +0 -99
  65. package/dist/tools/percy-mcp/creation/finalize-build.d.ts +0 -12
  66. package/dist/tools/percy-mcp/creation/finalize-build.js +0 -33
  67. package/dist/tools/percy-mcp/creation/finalize-comparison.d.ts +0 -10
  68. package/dist/tools/percy-mcp/creation/finalize-comparison.js +0 -16
  69. package/dist/tools/percy-mcp/creation/finalize-snapshot.d.ts +0 -12
  70. package/dist/tools/percy-mcp/creation/finalize-snapshot.js +0 -33
  71. package/dist/tools/percy-mcp/creation/upload-resource.d.ts +0 -15
  72. package/dist/tools/percy-mcp/creation/upload-resource.js +0 -43
  73. package/dist/tools/percy-mcp/creation/upload-tile.d.ts +0 -11
  74. package/dist/tools/percy-mcp/creation/upload-tile.js +0 -53
  75. package/dist/tools/percy-mcp/diagnostics/analyze-logs-realtime.d.ts +0 -13
  76. package/dist/tools/percy-mcp/diagnostics/analyze-logs-realtime.js +0 -65
  77. package/dist/tools/percy-mcp/diagnostics/get-build-logs.d.ts +0 -17
  78. package/dist/tools/percy-mcp/diagnostics/get-build-logs.js +0 -74
  79. package/dist/tools/percy-mcp/diagnostics/get-network-logs.d.ts +0 -5
  80. package/dist/tools/percy-mcp/diagnostics/get-network-logs.js +0 -21
  81. package/dist/tools/percy-mcp/diagnostics/get-suggestions.d.ts +0 -7
  82. package/dist/tools/percy-mcp/diagnostics/get-suggestions.js +0 -24
  83. package/dist/tools/percy-mcp/index.d.ts +0 -36
  84. package/dist/tools/percy-mcp/index.js +0 -1137
  85. package/dist/tools/percy-mcp/intelligence/get-ai-analysis.d.ts +0 -15
  86. package/dist/tools/percy-mcp/intelligence/get-ai-analysis.js +0 -166
  87. package/dist/tools/percy-mcp/intelligence/get-ai-quota.d.ts +0 -9
  88. package/dist/tools/percy-mcp/intelligence/get-ai-quota.js +0 -73
  89. package/dist/tools/percy-mcp/intelligence/get-build-summary.d.ts +0 -11
  90. package/dist/tools/percy-mcp/intelligence/get-build-summary.js +0 -78
  91. package/dist/tools/percy-mcp/intelligence/get-rca.d.ts +0 -6
  92. package/dist/tools/percy-mcp/intelligence/get-rca.js +0 -153
  93. package/dist/tools/percy-mcp/intelligence/suggest-prompt.d.ts +0 -15
  94. package/dist/tools/percy-mcp/intelligence/suggest-prompt.js +0 -86
  95. package/dist/tools/percy-mcp/intelligence/trigger-ai-recompute.d.ts +0 -16
  96. package/dist/tools/percy-mcp/intelligence/trigger-ai-recompute.js +0 -64
  97. package/dist/tools/percy-mcp/management/create-project.d.ts +0 -14
  98. package/dist/tools/percy-mcp/management/create-project.js +0 -52
  99. package/dist/tools/percy-mcp/management/get-usage-stats.d.ts +0 -12
  100. package/dist/tools/percy-mcp/management/get-usage-stats.js +0 -61
  101. package/dist/tools/percy-mcp/management/manage-browser-targets.d.ts +0 -12
  102. package/dist/tools/percy-mcp/management/manage-browser-targets.js +0 -136
  103. package/dist/tools/percy-mcp/management/manage-comments.d.ts +0 -14
  104. package/dist/tools/percy-mcp/management/manage-comments.js +0 -147
  105. package/dist/tools/percy-mcp/management/manage-ignored-regions.d.ts +0 -18
  106. package/dist/tools/percy-mcp/management/manage-ignored-regions.js +0 -182
  107. package/dist/tools/percy-mcp/management/manage-project-settings.d.ts +0 -16
  108. package/dist/tools/percy-mcp/management/manage-project-settings.js +0 -97
  109. package/dist/tools/percy-mcp/management/manage-tokens.d.ts +0 -14
  110. package/dist/tools/percy-mcp/management/manage-tokens.js +0 -90
  111. package/dist/tools/percy-mcp/management/manage-webhooks.d.ts +0 -15
  112. package/dist/tools/percy-mcp/management/manage-webhooks.js +0 -180
  113. package/dist/tools/percy-mcp/v2/auth-status.d.ts +0 -3
  114. package/dist/tools/percy-mcp/v2/auth-status.js +0 -80
  115. package/dist/tools/percy-mcp/v2/clone-build.d.ts +0 -24
  116. package/dist/tools/percy-mcp/v2/clone-build.js +0 -539
  117. package/dist/tools/percy-mcp/v2/create-app-build.d.ts +0 -28
  118. package/dist/tools/percy-mcp/v2/create-app-build.js +0 -442
  119. package/dist/tools/percy-mcp/v2/create-build.d.ts +0 -16
  120. package/dist/tools/percy-mcp/v2/create-build.js +0 -601
  121. package/dist/tools/percy-mcp/v2/create-project.d.ts +0 -8
  122. package/dist/tools/percy-mcp/v2/create-project.js +0 -33
  123. package/dist/tools/percy-mcp/v2/discover-urls.d.ts +0 -7
  124. package/dist/tools/percy-mcp/v2/discover-urls.js +0 -38
  125. package/dist/tools/percy-mcp/v2/figma-baseline.d.ts +0 -7
  126. package/dist/tools/percy-mcp/v2/figma-baseline.js +0 -18
  127. package/dist/tools/percy-mcp/v2/figma-build.d.ts +0 -7
  128. package/dist/tools/percy-mcp/v2/figma-build.js +0 -39
  129. package/dist/tools/percy-mcp/v2/figma-link.d.ts +0 -6
  130. package/dist/tools/percy-mcp/v2/figma-link.js +0 -27
  131. package/dist/tools/percy-mcp/v2/get-ai-summary.d.ts +0 -5
  132. package/dist/tools/percy-mcp/v2/get-ai-summary.js +0 -109
  133. package/dist/tools/percy-mcp/v2/get-build-detail.d.ts +0 -22
  134. package/dist/tools/percy-mcp/v2/get-build-detail.js +0 -567
  135. package/dist/tools/percy-mcp/v2/get-builds.d.ts +0 -8
  136. package/dist/tools/percy-mcp/v2/get-builds.js +0 -63
  137. package/dist/tools/percy-mcp/v2/get-comparison.d.ts +0 -5
  138. package/dist/tools/percy-mcp/v2/get-comparison.js +0 -94
  139. package/dist/tools/percy-mcp/v2/get-devices.d.ts +0 -5
  140. package/dist/tools/percy-mcp/v2/get-devices.js +0 -33
  141. package/dist/tools/percy-mcp/v2/get-insights.d.ts +0 -7
  142. package/dist/tools/percy-mcp/v2/get-insights.js +0 -52
  143. package/dist/tools/percy-mcp/v2/get-projects.d.ts +0 -6
  144. package/dist/tools/percy-mcp/v2/get-projects.js +0 -41
  145. package/dist/tools/percy-mcp/v2/get-snapshot.d.ts +0 -5
  146. package/dist/tools/percy-mcp/v2/get-snapshot.js +0 -96
  147. package/dist/tools/percy-mcp/v2/get-test-case-history.d.ts +0 -5
  148. package/dist/tools/percy-mcp/v2/get-test-case-history.js +0 -20
  149. package/dist/tools/percy-mcp/v2/get-test-cases.d.ts +0 -6
  150. package/dist/tools/percy-mcp/v2/get-test-cases.js +0 -36
  151. package/dist/tools/percy-mcp/v2/index.d.ts +0 -35
  152. package/dist/tools/percy-mcp/v2/index.js +0 -544
  153. package/dist/tools/percy-mcp/v2/list-integrations.d.ts +0 -5
  154. package/dist/tools/percy-mcp/v2/list-integrations.js +0 -41
  155. package/dist/tools/percy-mcp/v2/manage-domains.d.ts +0 -8
  156. package/dist/tools/percy-mcp/v2/manage-domains.js +0 -33
  157. package/dist/tools/percy-mcp/v2/manage-insights-email.d.ts +0 -8
  158. package/dist/tools/percy-mcp/v2/manage-insights-email.js +0 -49
  159. package/dist/tools/percy-mcp/v2/manage-usage-alerts.d.ts +0 -10
  160. package/dist/tools/percy-mcp/v2/manage-usage-alerts.js +0 -43
  161. package/dist/tools/percy-mcp/v2/migrate-integrations.d.ts +0 -6
  162. package/dist/tools/percy-mcp/v2/migrate-integrations.js +0 -20
  163. package/dist/tools/percy-mcp/v2/preview-comparison.d.ts +0 -5
  164. package/dist/tools/percy-mcp/v2/preview-comparison.js +0 -17
  165. package/dist/tools/percy-mcp/v2/search-build-items.d.ts +0 -12
  166. package/dist/tools/percy-mcp/v2/search-build-items.js +0 -45
  167. package/dist/tools/percy-mcp/workflows/auto-triage.d.ts +0 -7
  168. package/dist/tools/percy-mcp/workflows/auto-triage.js +0 -82
  169. package/dist/tools/percy-mcp/workflows/clone-build.d.ts +0 -22
  170. package/dist/tools/percy-mcp/workflows/clone-build.js +0 -414
  171. package/dist/tools/percy-mcp/workflows/create-percy-build.d.ts +0 -32
  172. package/dist/tools/percy-mcp/workflows/create-percy-build.js +0 -434
  173. package/dist/tools/percy-mcp/workflows/debug-failed-build.d.ts +0 -5
  174. package/dist/tools/percy-mcp/workflows/debug-failed-build.js +0 -122
  175. package/dist/tools/percy-mcp/workflows/diff-explain.d.ts +0 -6
  176. package/dist/tools/percy-mcp/workflows/diff-explain.js +0 -147
  177. package/dist/tools/percy-mcp/workflows/pr-visual-report.d.ts +0 -8
  178. package/dist/tools/percy-mcp/workflows/pr-visual-report.js +0 -184
  179. package/dist/tools/percy-mcp/workflows/run-tests.d.ts +0 -17
  180. package/dist/tools/percy-mcp/workflows/run-tests.js +0 -107
  181. package/dist/tools/percy-mcp/workflows/snapshot-urls.d.ts +0 -18
  182. 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,5 +0,0 @@
1
- import { BrowserStackConfig } from "../../../lib/types.js";
2
- import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
- export declare function percyGetNetworkLogs(args: {
4
- comparison_id: string;
5
- }, config: BrowserStackConfig): Promise<CallToolResult>;
@@ -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;