@browserstack/mcp-server 1.2.15-beta.1 → 1.2.15-beta.2

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 (170) hide show
  1. package/dist/lib/percy-api/auth.d.ts +41 -0
  2. package/dist/lib/percy-api/auth.js +96 -0
  3. package/dist/lib/percy-api/cache.d.ts +28 -0
  4. package/dist/lib/percy-api/cache.js +48 -0
  5. package/dist/lib/percy-api/client.d.ts +69 -0
  6. package/dist/lib/percy-api/client.js +275 -0
  7. package/dist/lib/percy-api/errors.d.ts +15 -0
  8. package/dist/lib/percy-api/errors.js +52 -0
  9. package/dist/lib/percy-api/formatter.d.ts +16 -0
  10. package/dist/lib/percy-api/formatter.js +344 -0
  11. package/dist/lib/percy-api/percy-auth.d.ts +43 -0
  12. package/dist/lib/percy-api/percy-auth.js +137 -0
  13. package/dist/lib/percy-api/percy-error-handler.d.ts +24 -0
  14. package/dist/lib/percy-api/percy-error-handler.js +302 -0
  15. package/dist/lib/percy-api/percy-session.d.ts +42 -0
  16. package/dist/lib/percy-api/percy-session.js +87 -0
  17. package/dist/lib/percy-api/polling.d.ts +26 -0
  18. package/dist/lib/percy-api/polling.js +42 -0
  19. package/dist/lib/percy-api/types.d.ts +56 -0
  20. package/dist/lib/percy-api/types.js +76 -0
  21. package/dist/server-factory.js +4 -0
  22. package/dist/tools/percy-mcp/advanced/branchline-operations.d.ts +16 -0
  23. package/dist/tools/percy-mcp/advanced/branchline-operations.js +81 -0
  24. package/dist/tools/percy-mcp/advanced/manage-variants.d.ts +16 -0
  25. package/dist/tools/percy-mcp/advanced/manage-variants.js +155 -0
  26. package/dist/tools/percy-mcp/advanced/manage-visual-monitoring.d.ts +16 -0
  27. package/dist/tools/percy-mcp/advanced/manage-visual-monitoring.js +171 -0
  28. package/dist/tools/percy-mcp/auth/auth-status.d.ts +3 -0
  29. package/dist/tools/percy-mcp/auth/auth-status.js +131 -0
  30. package/dist/tools/percy-mcp/core/approve-build.d.ts +14 -0
  31. package/dist/tools/percy-mcp/core/approve-build.js +97 -0
  32. package/dist/tools/percy-mcp/core/get-build-items.d.ts +13 -0
  33. package/dist/tools/percy-mcp/core/get-build-items.js +65 -0
  34. package/dist/tools/percy-mcp/core/get-build.d.ts +10 -0
  35. package/dist/tools/percy-mcp/core/get-build.js +16 -0
  36. package/dist/tools/percy-mcp/core/get-comparison.d.ts +11 -0
  37. package/dist/tools/percy-mcp/core/get-comparison.js +59 -0
  38. package/dist/tools/percy-mcp/core/get-snapshot.d.ts +10 -0
  39. package/dist/tools/percy-mcp/core/get-snapshot.js +40 -0
  40. package/dist/tools/percy-mcp/core/list-builds.d.ts +14 -0
  41. package/dist/tools/percy-mcp/core/list-builds.js +45 -0
  42. package/dist/tools/percy-mcp/core/list-projects.d.ts +12 -0
  43. package/dist/tools/percy-mcp/core/list-projects.js +51 -0
  44. package/dist/tools/percy-mcp/creation/create-app-snapshot.d.ts +12 -0
  45. package/dist/tools/percy-mcp/creation/create-app-snapshot.js +29 -0
  46. package/dist/tools/percy-mcp/creation/create-build.d.ts +19 -0
  47. package/dist/tools/percy-mcp/creation/create-build.js +68 -0
  48. package/dist/tools/percy-mcp/creation/create-comparison.d.ts +18 -0
  49. package/dist/tools/percy-mcp/creation/create-comparison.js +90 -0
  50. package/dist/tools/percy-mcp/creation/create-snapshot.d.ts +17 -0
  51. package/dist/tools/percy-mcp/creation/create-snapshot.js +99 -0
  52. package/dist/tools/percy-mcp/creation/finalize-build.d.ts +12 -0
  53. package/dist/tools/percy-mcp/creation/finalize-build.js +33 -0
  54. package/dist/tools/percy-mcp/creation/finalize-comparison.d.ts +10 -0
  55. package/dist/tools/percy-mcp/creation/finalize-comparison.js +16 -0
  56. package/dist/tools/percy-mcp/creation/finalize-snapshot.d.ts +12 -0
  57. package/dist/tools/percy-mcp/creation/finalize-snapshot.js +33 -0
  58. package/dist/tools/percy-mcp/creation/upload-resource.d.ts +15 -0
  59. package/dist/tools/percy-mcp/creation/upload-resource.js +43 -0
  60. package/dist/tools/percy-mcp/creation/upload-tile.d.ts +11 -0
  61. package/dist/tools/percy-mcp/creation/upload-tile.js +53 -0
  62. package/dist/tools/percy-mcp/diagnostics/analyze-logs-realtime.d.ts +13 -0
  63. package/dist/tools/percy-mcp/diagnostics/analyze-logs-realtime.js +65 -0
  64. package/dist/tools/percy-mcp/diagnostics/get-build-logs.d.ts +17 -0
  65. package/dist/tools/percy-mcp/diagnostics/get-build-logs.js +74 -0
  66. package/dist/tools/percy-mcp/diagnostics/get-network-logs.d.ts +5 -0
  67. package/dist/tools/percy-mcp/diagnostics/get-network-logs.js +21 -0
  68. package/dist/tools/percy-mcp/diagnostics/get-suggestions.d.ts +7 -0
  69. package/dist/tools/percy-mcp/diagnostics/get-suggestions.js +24 -0
  70. package/dist/tools/percy-mcp/index.d.ts +36 -0
  71. package/dist/tools/percy-mcp/index.js +1137 -0
  72. package/dist/tools/percy-mcp/intelligence/get-ai-analysis.d.ts +15 -0
  73. package/dist/tools/percy-mcp/intelligence/get-ai-analysis.js +166 -0
  74. package/dist/tools/percy-mcp/intelligence/get-ai-quota.d.ts +9 -0
  75. package/dist/tools/percy-mcp/intelligence/get-ai-quota.js +73 -0
  76. package/dist/tools/percy-mcp/intelligence/get-build-summary.d.ts +11 -0
  77. package/dist/tools/percy-mcp/intelligence/get-build-summary.js +78 -0
  78. package/dist/tools/percy-mcp/intelligence/get-rca.d.ts +6 -0
  79. package/dist/tools/percy-mcp/intelligence/get-rca.js +153 -0
  80. package/dist/tools/percy-mcp/intelligence/suggest-prompt.d.ts +15 -0
  81. package/dist/tools/percy-mcp/intelligence/suggest-prompt.js +86 -0
  82. package/dist/tools/percy-mcp/intelligence/trigger-ai-recompute.d.ts +16 -0
  83. package/dist/tools/percy-mcp/intelligence/trigger-ai-recompute.js +64 -0
  84. package/dist/tools/percy-mcp/management/create-project.d.ts +14 -0
  85. package/dist/tools/percy-mcp/management/create-project.js +52 -0
  86. package/dist/tools/percy-mcp/management/get-usage-stats.d.ts +12 -0
  87. package/dist/tools/percy-mcp/management/get-usage-stats.js +61 -0
  88. package/dist/tools/percy-mcp/management/manage-browser-targets.d.ts +12 -0
  89. package/dist/tools/percy-mcp/management/manage-browser-targets.js +136 -0
  90. package/dist/tools/percy-mcp/management/manage-comments.d.ts +14 -0
  91. package/dist/tools/percy-mcp/management/manage-comments.js +147 -0
  92. package/dist/tools/percy-mcp/management/manage-ignored-regions.d.ts +18 -0
  93. package/dist/tools/percy-mcp/management/manage-ignored-regions.js +182 -0
  94. package/dist/tools/percy-mcp/management/manage-project-settings.d.ts +16 -0
  95. package/dist/tools/percy-mcp/management/manage-project-settings.js +97 -0
  96. package/dist/tools/percy-mcp/management/manage-tokens.d.ts +14 -0
  97. package/dist/tools/percy-mcp/management/manage-tokens.js +90 -0
  98. package/dist/tools/percy-mcp/management/manage-webhooks.d.ts +15 -0
  99. package/dist/tools/percy-mcp/management/manage-webhooks.js +180 -0
  100. package/dist/tools/percy-mcp/v2/auth-status.d.ts +3 -0
  101. package/dist/tools/percy-mcp/v2/auth-status.js +80 -0
  102. package/dist/tools/percy-mcp/v2/clone-build.d.ts +24 -0
  103. package/dist/tools/percy-mcp/v2/clone-build.js +539 -0
  104. package/dist/tools/percy-mcp/v2/create-app-build.d.ts +28 -0
  105. package/dist/tools/percy-mcp/v2/create-app-build.js +442 -0
  106. package/dist/tools/percy-mcp/v2/create-build.d.ts +16 -0
  107. package/dist/tools/percy-mcp/v2/create-build.js +601 -0
  108. package/dist/tools/percy-mcp/v2/create-project.d.ts +8 -0
  109. package/dist/tools/percy-mcp/v2/create-project.js +33 -0
  110. package/dist/tools/percy-mcp/v2/discover-urls.d.ts +7 -0
  111. package/dist/tools/percy-mcp/v2/discover-urls.js +38 -0
  112. package/dist/tools/percy-mcp/v2/figma-baseline.d.ts +7 -0
  113. package/dist/tools/percy-mcp/v2/figma-baseline.js +18 -0
  114. package/dist/tools/percy-mcp/v2/figma-build.d.ts +7 -0
  115. package/dist/tools/percy-mcp/v2/figma-build.js +39 -0
  116. package/dist/tools/percy-mcp/v2/figma-link.d.ts +6 -0
  117. package/dist/tools/percy-mcp/v2/figma-link.js +27 -0
  118. package/dist/tools/percy-mcp/v2/get-ai-summary.d.ts +5 -0
  119. package/dist/tools/percy-mcp/v2/get-ai-summary.js +109 -0
  120. package/dist/tools/percy-mcp/v2/get-build-detail.d.ts +22 -0
  121. package/dist/tools/percy-mcp/v2/get-build-detail.js +567 -0
  122. package/dist/tools/percy-mcp/v2/get-builds.d.ts +8 -0
  123. package/dist/tools/percy-mcp/v2/get-builds.js +63 -0
  124. package/dist/tools/percy-mcp/v2/get-comparison.d.ts +5 -0
  125. package/dist/tools/percy-mcp/v2/get-comparison.js +94 -0
  126. package/dist/tools/percy-mcp/v2/get-devices.d.ts +5 -0
  127. package/dist/tools/percy-mcp/v2/get-devices.js +33 -0
  128. package/dist/tools/percy-mcp/v2/get-insights.d.ts +7 -0
  129. package/dist/tools/percy-mcp/v2/get-insights.js +52 -0
  130. package/dist/tools/percy-mcp/v2/get-projects.d.ts +6 -0
  131. package/dist/tools/percy-mcp/v2/get-projects.js +41 -0
  132. package/dist/tools/percy-mcp/v2/get-snapshot.d.ts +5 -0
  133. package/dist/tools/percy-mcp/v2/get-snapshot.js +96 -0
  134. package/dist/tools/percy-mcp/v2/get-test-case-history.d.ts +5 -0
  135. package/dist/tools/percy-mcp/v2/get-test-case-history.js +20 -0
  136. package/dist/tools/percy-mcp/v2/get-test-cases.d.ts +6 -0
  137. package/dist/tools/percy-mcp/v2/get-test-cases.js +36 -0
  138. package/dist/tools/percy-mcp/v2/index.d.ts +35 -0
  139. package/dist/tools/percy-mcp/v2/index.js +544 -0
  140. package/dist/tools/percy-mcp/v2/list-integrations.d.ts +5 -0
  141. package/dist/tools/percy-mcp/v2/list-integrations.js +41 -0
  142. package/dist/tools/percy-mcp/v2/manage-domains.d.ts +8 -0
  143. package/dist/tools/percy-mcp/v2/manage-domains.js +33 -0
  144. package/dist/tools/percy-mcp/v2/manage-insights-email.d.ts +8 -0
  145. package/dist/tools/percy-mcp/v2/manage-insights-email.js +49 -0
  146. package/dist/tools/percy-mcp/v2/manage-usage-alerts.d.ts +10 -0
  147. package/dist/tools/percy-mcp/v2/manage-usage-alerts.js +43 -0
  148. package/dist/tools/percy-mcp/v2/migrate-integrations.d.ts +6 -0
  149. package/dist/tools/percy-mcp/v2/migrate-integrations.js +20 -0
  150. package/dist/tools/percy-mcp/v2/preview-comparison.d.ts +5 -0
  151. package/dist/tools/percy-mcp/v2/preview-comparison.js +17 -0
  152. package/dist/tools/percy-mcp/v2/search-build-items.d.ts +12 -0
  153. package/dist/tools/percy-mcp/v2/search-build-items.js +45 -0
  154. package/dist/tools/percy-mcp/workflows/auto-triage.d.ts +7 -0
  155. package/dist/tools/percy-mcp/workflows/auto-triage.js +82 -0
  156. package/dist/tools/percy-mcp/workflows/clone-build.d.ts +22 -0
  157. package/dist/tools/percy-mcp/workflows/clone-build.js +414 -0
  158. package/dist/tools/percy-mcp/workflows/create-percy-build.d.ts +32 -0
  159. package/dist/tools/percy-mcp/workflows/create-percy-build.js +434 -0
  160. package/dist/tools/percy-mcp/workflows/debug-failed-build.d.ts +5 -0
  161. package/dist/tools/percy-mcp/workflows/debug-failed-build.js +122 -0
  162. package/dist/tools/percy-mcp/workflows/diff-explain.d.ts +6 -0
  163. package/dist/tools/percy-mcp/workflows/diff-explain.js +147 -0
  164. package/dist/tools/percy-mcp/workflows/pr-visual-report.d.ts +8 -0
  165. package/dist/tools/percy-mcp/workflows/pr-visual-report.js +184 -0
  166. package/dist/tools/percy-mcp/workflows/run-tests.d.ts +17 -0
  167. package/dist/tools/percy-mcp/workflows/run-tests.js +107 -0
  168. package/dist/tools/percy-mcp/workflows/snapshot-urls.d.ts +18 -0
  169. package/dist/tools/percy-mcp/workflows/snapshot-urls.js +197 -0
  170. package/package.json +3 -2
@@ -0,0 +1,7 @@
1
+ import { BrowserStackConfig } from "../../../lib/types.js";
2
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ export declare function percyFigmaBaseline(args: {
4
+ project_slug: string;
5
+ branch: string;
6
+ build_id: string;
7
+ }, config: BrowserStackConfig): Promise<CallToolResult>;
@@ -0,0 +1,18 @@
1
+ import { percyPost } from "../../../lib/percy-api/percy-auth.js";
2
+ export async function percyFigmaBaseline(args, config) {
3
+ await percyPost("/design/figma/update-baseline", config, {
4
+ data: {
5
+ attributes: {
6
+ "project-slug": args.project_slug,
7
+ branch: args.branch,
8
+ "build-id": args.build_id,
9
+ },
10
+ },
11
+ });
12
+ let output = `## Figma Baseline Updated\n\n`;
13
+ output += `**Project:** ${args.project_slug}\n`;
14
+ output += `**Branch:** ${args.branch}\n`;
15
+ output += `**Build:** ${args.build_id}\n`;
16
+ output += `Baseline has been updated from the latest Figma designs.\n`;
17
+ return { content: [{ type: "text", text: output }] };
18
+ }
@@ -0,0 +1,7 @@
1
+ import { BrowserStackConfig } from "../../../lib/types.js";
2
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ export declare function percyFigmaBuild(args: {
4
+ project_slug: string;
5
+ branch: string;
6
+ figma_url: string;
7
+ }, config: BrowserStackConfig): Promise<CallToolResult>;
@@ -0,0 +1,39 @@
1
+ import { percyPost } from "../../../lib/percy-api/percy-auth.js";
2
+ export async function percyFigmaBuild(args, config) {
3
+ // Step 1: Fetch design from Figma URL
4
+ const fetchResult = await percyPost("/design/figma/fetch-design", config, {
5
+ data: { attributes: { "figma-url": args.figma_url } },
6
+ });
7
+ const nodes = fetchResult?.data?.attributes?.nodes || fetchResult?.nodes || [];
8
+ if (!nodes.length && !fetchResult?.data) {
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `No design nodes found at ${args.figma_url}. Check the Figma URL and ensure it points to a frame or component.`,
14
+ },
15
+ ],
16
+ isError: true,
17
+ };
18
+ }
19
+ // Step 2: Create build from design data
20
+ const figmaData = Array.isArray(nodes) ? nodes : [nodes];
21
+ const buildResult = await percyPost("/design/figma/create-build", config, {
22
+ data: {
23
+ attributes: {
24
+ branch: args.branch,
25
+ "project-slug": args.project_slug,
26
+ "figma-url": args.figma_url,
27
+ "figma-data": figmaData,
28
+ },
29
+ },
30
+ });
31
+ const buildId = buildResult?.data?.id || "unknown";
32
+ let output = `## Figma Build Created\n\n`;
33
+ output += `**Build ID:** ${buildId}\n`;
34
+ output += `**Project:** ${args.project_slug}\n`;
35
+ output += `**Branch:** ${args.branch}\n`;
36
+ output += `**Figma URL:** ${args.figma_url}\n`;
37
+ output += `**Design nodes:** ${figmaData.length}\n`;
38
+ return { content: [{ type: "text", text: output }] };
39
+ }
@@ -0,0 +1,6 @@
1
+ import { BrowserStackConfig } from "../../../lib/types.js";
2
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ export declare function percyFigmaLink(args: {
4
+ snapshot_id?: string;
5
+ comparison_id?: string;
6
+ }, config: BrowserStackConfig): Promise<CallToolResult>;
@@ -0,0 +1,27 @@
1
+ import { percyGet } from "../../../lib/percy-api/percy-auth.js";
2
+ export async function percyFigmaLink(args, config) {
3
+ const params = {};
4
+ if (args.snapshot_id)
5
+ params.snapshot_id = args.snapshot_id;
6
+ if (args.comparison_id)
7
+ params.comparison_id = args.comparison_id;
8
+ const result = await percyGet("/design/figma/figma-link", config, params);
9
+ const link = result?.data?.attributes?.["figma-url"] || result?.figma_url || null;
10
+ if (!link) {
11
+ return {
12
+ content: [
13
+ {
14
+ type: "text",
15
+ text: "No Figma link found for this snapshot/comparison.",
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ let output = `## Figma Link\n\n`;
21
+ output += `**Link:** ${link}\n`;
22
+ if (args.snapshot_id)
23
+ output += `**Snapshot:** ${args.snapshot_id}\n`;
24
+ if (args.comparison_id)
25
+ output += `**Comparison:** ${args.comparison_id}\n`;
26
+ return { content: [{ type: "text", text: output }] };
27
+ }
@@ -0,0 +1,5 @@
1
+ import { BrowserStackConfig } from "../../../lib/types.js";
2
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ export declare function percyGetAiSummary(args: {
4
+ build_id: string;
5
+ }, config: BrowserStackConfig): Promise<CallToolResult>;
@@ -0,0 +1,109 @@
1
+ import { percyGet } from "../../../lib/percy-api/percy-auth.js";
2
+ export async function percyGetAiSummary(args, config) {
3
+ // Get build with build-summary include
4
+ const response = await percyGet(`/builds/${args.build_id}`, config, {
5
+ include: "build-summary",
6
+ });
7
+ const build = response?.data || {};
8
+ const attrs = build.attributes || {};
9
+ const buildNum = attrs["build-number"] || args.build_id;
10
+ const state = attrs.state || "unknown";
11
+ // Get AI details from build attributes
12
+ const ai = attrs["ai-details"] || {};
13
+ const potentialBugs = ai["total-potential-bugs"] ?? 0;
14
+ const aiVisualDiffs = ai["total-ai-visual-diffs"] ?? 0;
15
+ const diffsReduced = ai["total-diffs-reduced-capped"] ?? 0;
16
+ const comparisonsWithAi = ai["total-comparisons-with-ai"] ?? 0;
17
+ const allCompleted = ai["all-ai-jobs-completed"] ?? false;
18
+ const summaryStatus = ai["summary-status"];
19
+ // Get build summary from included data
20
+ const included = response?.included || [];
21
+ const summaryObj = included.find((i) => i.type === "build-summaries");
22
+ const summaryJson = summaryObj?.attributes?.summary;
23
+ let output = `## Percy Build #${buildNum} — AI Build Summary\n\n`;
24
+ // Check for actual AI data, not just the toggle flag
25
+ const hasAiData = (comparisonsWithAi ?? 0) > 0 ||
26
+ (potentialBugs ?? 0) > 0 ||
27
+ (aiVisualDiffs ?? 0) > 0 ||
28
+ summaryStatus === "ok";
29
+ if (!hasAiData) {
30
+ output += `No AI analysis data found for this build.\n`;
31
+ output += `AI may not be enabled, or the build has no visual diffs.\n`;
32
+ return { content: [{ type: "text", text: output }] };
33
+ }
34
+ if (state !== "finished") {
35
+ output += `Build is **${state}**. AI summary is available after the build finishes.\n`;
36
+ return { content: [{ type: "text", text: output }] };
37
+ }
38
+ // AI stats header
39
+ output += `**${potentialBugs} potential bug${potentialBugs !== 1 ? "s" : ""}** · **${aiVisualDiffs} AI visual diff${aiVisualDiffs !== 1 ? "s" : ""}**\n\n`;
40
+ if (diffsReduced > 0) {
41
+ output += `AI reduced noise by **${diffsReduced}** diff${diffsReduced !== 1 ? "s" : ""}.\n`;
42
+ }
43
+ if (comparisonsWithAi > 0) {
44
+ output += `**${comparisonsWithAi}** comparison${comparisonsWithAi !== 1 ? "s" : ""} analyzed by AI.\n`;
45
+ }
46
+ output += `AI jobs: ${allCompleted ? "completed" : "in progress"}\n\n`;
47
+ // Parse and display the build summary
48
+ if (summaryJson) {
49
+ try {
50
+ const summary = typeof summaryJson === "string" ? JSON.parse(summaryJson) : summaryJson;
51
+ if (summary.title) {
52
+ output += `### Summary\n\n`;
53
+ output += `> ${summary.title}\n\n`;
54
+ }
55
+ // Display items (change descriptions with occurrences)
56
+ const items = summary.items || summary.changes || [];
57
+ if (items.length > 0) {
58
+ output += `### Changes\n\n`;
59
+ items.forEach((item) => {
60
+ const title = item.title || item.description || item.name || String(item);
61
+ const occurrences = item.occurrences || item.count || item.occurrence_count;
62
+ output += `- **${title}**`;
63
+ if (occurrences)
64
+ output += ` (${occurrences} occurrence${occurrences !== 1 ? "s" : ""})`;
65
+ output += "\n";
66
+ });
67
+ output += "\n";
68
+ }
69
+ // Display snapshots if available
70
+ const snapshots = summary.snapshots || [];
71
+ if (snapshots.length > 0) {
72
+ output += `### Affected Snapshots\n\n`;
73
+ snapshots.forEach((snap) => {
74
+ const name = snap.name || snap.snapshot_name || "Unknown";
75
+ const changes = snap.changes || snap.items || [];
76
+ output += `**${name}**\n`;
77
+ changes.forEach((change) => {
78
+ output += ` - ${change.title || change.description || change}\n`;
79
+ });
80
+ });
81
+ output += "\n";
82
+ }
83
+ }
84
+ catch {
85
+ // Summary is not valid JSON — show raw
86
+ output += `### Raw Summary\n\n`;
87
+ output += `${String(summaryJson).slice(0, 1000)}\n\n`;
88
+ }
89
+ }
90
+ else if (summaryStatus === "processing") {
91
+ output += `### Summary\n\nAI summary is being generated. Try again in a minute.\n`;
92
+ }
93
+ else if (summaryStatus === "skipped") {
94
+ const reason = ai["summary-reason"] || "unknown";
95
+ output += `### Summary\n\nAI summary was skipped: ${reason}\n`;
96
+ if (reason === "too_many_comparisons") {
97
+ output += `(Build has more than 50 comparisons — summaries are only generated for smaller builds)\n`;
98
+ }
99
+ }
100
+ else {
101
+ output += `### Summary\n\nNo AI summary available for this build.\n`;
102
+ }
103
+ // Build URL
104
+ const webUrl = attrs["web-url"];
105
+ if (webUrl) {
106
+ output += `**View in Percy:** ${webUrl}\n`;
107
+ }
108
+ return { content: [{ type: "text", text: output }] };
109
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * percy_get_build — Unified build details tool.
3
+ *
4
+ * detail param routes to different views:
5
+ * - overview: status, stats, AI metrics, browsers, summary preview
6
+ * - ai_summary: full AI change descriptions with occurrences
7
+ * - changes: changed snapshots with diff ratios and bugs
8
+ * - rca: root cause analysis for a comparison
9
+ * - logs: failure diagnostics and suggestions
10
+ * - network: network request logs for a comparison
11
+ * - snapshots: all snapshots with review states
12
+ */
13
+ import { BrowserStackConfig } from "../../../lib/types.js";
14
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
15
+ interface GetBuildArgs {
16
+ build_id: string;
17
+ detail?: string;
18
+ comparison_id?: string;
19
+ snapshot_id?: string;
20
+ }
21
+ export declare function percyGetBuildDetail(args: GetBuildArgs, config: BrowserStackConfig): Promise<CallToolResult>;
22
+ export {};