@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,64 +0,0 @@
1
- /**
2
- * percy_trigger_ai_recompute — Re-run Percy AI analysis with a custom prompt.
3
- *
4
- * Sends a recompute request for a build or single comparison, optionally
5
- * with a user-supplied prompt and ignore/unignore mode.
6
- */
7
- import { PercyClient } from "../../../lib/percy-api/client.js";
8
- export async function percyTriggerAiRecompute(args, config) {
9
- const client = new PercyClient(config);
10
- if (!args.build_id && !args.comparison_id) {
11
- return {
12
- content: [
13
- {
14
- type: "text",
15
- text: "Either build_id or comparison_id is required.",
16
- },
17
- ],
18
- isError: true,
19
- };
20
- }
21
- const body = {
22
- data: {
23
- type: "ai-recompute",
24
- attributes: {
25
- ...(args.prompt && { "user-prompt": args.prompt }),
26
- ...(args.mode && { mode: args.mode }),
27
- ...(args.comparison_id && {
28
- "comparison-id": parseInt(args.comparison_id, 10),
29
- }),
30
- ...(args.build_id && {
31
- "build-id": parseInt(args.build_id, 10),
32
- }),
33
- },
34
- },
35
- };
36
- try {
37
- await client.post("/ai-recompute", body);
38
- let output = "## AI Recompute Triggered\n\n";
39
- output += `**Mode:** ${args.mode || "ignore"}\n`;
40
- if (args.prompt)
41
- output += `**Prompt:** ${args.prompt}\n`;
42
- output += `**Status:** Processing\n\n`;
43
- output +=
44
- "The AI will re-analyze the visual diffs with your custom prompt. ";
45
- output +=
46
- "Use `percy_get_ai_analysis` to check results after processing completes (typically 30-60 seconds).\n";
47
- return { content: [{ type: "text", text: output }] };
48
- }
49
- catch (e) {
50
- const message = e instanceof Error ? e.message : String(e);
51
- if (message.includes("quota")) {
52
- return {
53
- content: [
54
- {
55
- type: "text",
56
- text: "AI recompute quota exceeded for today. Try again tomorrow or upgrade your plan.",
57
- },
58
- ],
59
- isError: true,
60
- };
61
- }
62
- throw e;
63
- }
64
- }
@@ -1,14 +0,0 @@
1
- import { BrowserStackConfig } from "../../../lib/types.js";
2
- import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
- /**
4
- * Creates a Percy project using the BrowserStack API.
5
- *
6
- * Uses `api.browserstack.com/api/app_percy/get_project_token` which:
7
- * - Creates the project if it doesn't exist
8
- * - Returns a project token for the project
9
- * - Requires BrowserStack Basic Auth (username + access key)
10
- */
11
- export declare function percyCreateProject(args: {
12
- name: string;
13
- type?: string;
14
- }, config: BrowserStackConfig): Promise<CallToolResult>;
@@ -1,52 +0,0 @@
1
- import { getBrowserStackAuth } from "../../../lib/get-auth.js";
2
- /**
3
- * Creates a Percy project using the BrowserStack API.
4
- *
5
- * Uses `api.browserstack.com/api/app_percy/get_project_token` which:
6
- * - Creates the project if it doesn't exist
7
- * - Returns a project token for the project
8
- * - Requires BrowserStack Basic Auth (username + access key)
9
- */
10
- export async function percyCreateProject(args, config) {
11
- const authString = getBrowserStackAuth(config);
12
- const auth = Buffer.from(authString).toString("base64");
13
- const params = new URLSearchParams({ name: args.name });
14
- if (args.type) {
15
- params.append("type", args.type);
16
- }
17
- const url = `https://api.browserstack.com/api/app_percy/get_project_token?${params.toString()}`;
18
- const response = await fetch(url, {
19
- headers: {
20
- Authorization: `Basic ${auth}`,
21
- "Content-Type": "application/json",
22
- },
23
- });
24
- if (!response.ok) {
25
- const errorText = await response.text().catch(() => "");
26
- throw new Error(`Failed to create Percy project (${response.status}): ${errorText || response.statusText}`);
27
- }
28
- const data = await response.json();
29
- if (!data?.success) {
30
- throw new Error(data?.message ||
31
- "Project creation failed — check the project name and type.");
32
- }
33
- const token = data.token || "unknown";
34
- const tokenPrefix = token.split("_")[0] || "unknown";
35
- const maskedToken = token.length > 8 ? `${token.slice(0, 8)}...${token.slice(-4)}` : "****";
36
- let output = `## Percy Project Created\n\n`;
37
- output += `| Field | Value |\n`;
38
- output += `|-------|-------|\n`;
39
- output += `| **Name** | ${args.name} |\n`;
40
- output += `| **Type** | ${args.type || "auto (default)"} |\n`;
41
- output += `| **Token** | \`${maskedToken}\` |\n`;
42
- output += `| **Token type** | ${tokenPrefix} |\n`;
43
- output += `| **Capture mode** | ${data.percy_capture_mode || "auto"} |\n`;
44
- output += `\n### Project Token\n\n`;
45
- output += `\`\`\`\n${token}\n\`\`\`\n\n`;
46
- output += `> Save this token — set it as \`PERCY_TOKEN\` env var to use with other Percy tools.\n\n`;
47
- output += `### Next Steps\n\n`;
48
- output += `1. Set the token: \`export PERCY_TOKEN=${token}\`\n`;
49
- output += `2. Create a build: \`percy_create_build\` with project_id from Percy dashboard\n`;
50
- output += `3. Or run Percy CLI: \`percy exec -- your-test-command\`\n`;
51
- return { content: [{ type: "text", text: output }] };
52
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * percy_get_usage_stats — Get Percy screenshot usage, quota limits, and AI comparison
3
- * counts for an organization.
4
- */
5
- import { BrowserStackConfig } from "../../../lib/types.js";
6
- import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
7
- interface GetUsageStatsArgs {
8
- org_id: string;
9
- product?: string;
10
- }
11
- export declare function percyGetUsageStats(args: GetUsageStatsArgs, config: BrowserStackConfig): Promise<CallToolResult>;
12
- export {};
@@ -1,61 +0,0 @@
1
- /**
2
- * percy_get_usage_stats — Get Percy screenshot usage, quota limits, and AI comparison
3
- * counts for an organization.
4
- */
5
- import { PercyClient } from "../../../lib/percy-api/client.js";
6
- export async function percyGetUsageStats(args, config) {
7
- const { org_id, product } = args;
8
- const client = new PercyClient(config);
9
- const params = {
10
- "filter[organization-id]": org_id,
11
- };
12
- if (product) {
13
- params["filter[product]"] = product;
14
- }
15
- const response = await client.get("/usage-stats", params);
16
- const data = response?.data;
17
- const entries = Array.isArray(data) ? data : data ? [data] : [];
18
- if (entries.length === 0) {
19
- return {
20
- content: [
21
- { type: "text", text: "_No usage data found for this organization._" },
22
- ],
23
- };
24
- }
25
- const lines = [];
26
- lines.push(`## Percy Usage Stats (Org: ${org_id})`);
27
- lines.push("");
28
- for (const entry of entries) {
29
- const attrs = entry.attributes ?? entry;
30
- const entryProduct = attrs.product ?? attrs["product-type"] ?? "percy";
31
- lines.push(`### ${entryProduct}`);
32
- lines.push("");
33
- lines.push("| Metric | Value |");
34
- lines.push("|--------|-------|");
35
- const currentUsage = attrs.currentUsage ?? attrs["current-usage"] ?? attrs.usage ?? "?";
36
- const quota = attrs.quota ?? attrs["screenshot-quota"] ?? "?";
37
- const aiComparisons = attrs.aiComparisons ?? attrs["ai-comparisons"] ?? "N/A";
38
- const planType = attrs.planType ?? attrs["plan-type"] ?? "N/A";
39
- lines.push(`| Current Usage | ${currentUsage} |`);
40
- lines.push(`| Quota | ${quota} |`);
41
- lines.push(`| AI Comparisons | ${aiComparisons} |`);
42
- lines.push(`| Plan Type | ${planType} |`);
43
- // Include any additional numeric attrs
44
- for (const [key, value] of Object.entries(attrs)) {
45
- if (typeof value === "number" &&
46
- ![
47
- "currentUsage",
48
- "current-usage",
49
- "usage",
50
- "quota",
51
- "screenshot-quota",
52
- "aiComparisons",
53
- "ai-comparisons",
54
- ].includes(key)) {
55
- lines.push(`| ${key} | ${value} |`);
56
- }
57
- }
58
- lines.push("");
59
- }
60
- return { content: [{ type: "text", text: lines.join("\n") }] };
61
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * percy_manage_browser_targets — List, add, or remove browser targets for a project.
3
- */
4
- import { BrowserStackConfig } from "../../../lib/types.js";
5
- import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
6
- interface ManageBrowserTargetsArgs {
7
- project_id: string;
8
- action?: string;
9
- browser_family?: string;
10
- }
11
- export declare function percyManageBrowserTargets(args: ManageBrowserTargetsArgs, config: BrowserStackConfig): Promise<CallToolResult>;
12
- export {};
@@ -1,136 +0,0 @@
1
- /**
2
- * percy_manage_browser_targets — List, add, or remove browser targets for a project.
3
- */
4
- import { PercyClient } from "../../../lib/percy-api/client.js";
5
- export async function percyManageBrowserTargets(args, config) {
6
- const { project_id, action = "list", browser_family } = args;
7
- const client = new PercyClient(config);
8
- // ---- List ----
9
- if (action === "list") {
10
- const [families, targets] = await Promise.all([
11
- client.get("/browser-families"),
12
- client.get(`/projects/${project_id}/project-browser-targets`),
13
- ]);
14
- const familyList = Array.isArray(families?.data) ? families.data : [];
15
- const targetList = Array.isArray(targets?.data) ? targets.data : [];
16
- const lines = [];
17
- lines.push(`## Browser Targets for Project ${project_id}`);
18
- lines.push("");
19
- if (targetList.length === 0) {
20
- lines.push("_No browser targets configured. Using defaults._");
21
- }
22
- else {
23
- lines.push("### Active Targets");
24
- lines.push("");
25
- lines.push("| Browser Family | ID |");
26
- lines.push("|---------------|-----|");
27
- for (const target of targetList) {
28
- const attrs = target.attributes ?? target;
29
- const name = attrs.browserFamilySlug ??
30
- attrs["browser-family-slug"] ??
31
- attrs.name ??
32
- "unknown";
33
- lines.push(`| ${name} | ${target.id ?? "?"} |`);
34
- }
35
- }
36
- if (familyList.length > 0) {
37
- lines.push("");
38
- lines.push("### Available Browser Families");
39
- lines.push("");
40
- for (const family of familyList) {
41
- const attrs = family.attributes ?? family;
42
- const name = attrs.name ?? attrs.slug ?? "unknown";
43
- lines.push(`- ${name} (ID: ${family.id ?? "?"})`);
44
- }
45
- }
46
- return { content: [{ type: "text", text: lines.join("\n") }] };
47
- }
48
- // ---- Add ----
49
- if (action === "add") {
50
- if (!browser_family) {
51
- return {
52
- content: [
53
- {
54
- type: "text",
55
- text: "browser_family is required for the 'add' action. Use action='list' to see available families.",
56
- },
57
- ],
58
- isError: true,
59
- };
60
- }
61
- const body = {
62
- data: {
63
- type: "project-browser-targets",
64
- relationships: {
65
- project: { data: { type: "projects", id: project_id } },
66
- "browser-family": {
67
- data: { type: "browser-families", id: browser_family },
68
- },
69
- },
70
- },
71
- };
72
- try {
73
- await client.post("/project-browser-targets", body);
74
- return {
75
- content: [
76
- {
77
- type: "text",
78
- text: `Browser family ${browser_family} added to project ${project_id}.`,
79
- },
80
- ],
81
- };
82
- }
83
- catch (error) {
84
- const message = error instanceof Error ? error.message : String(error);
85
- return {
86
- content: [
87
- { type: "text", text: `Failed to add browser target: ${message}` },
88
- ],
89
- isError: true,
90
- };
91
- }
92
- }
93
- // ---- Remove ----
94
- if (action === "remove") {
95
- if (!browser_family) {
96
- return {
97
- content: [
98
- {
99
- type: "text",
100
- text: "browser_family (target ID) is required for the 'remove' action.",
101
- },
102
- ],
103
- isError: true,
104
- };
105
- }
106
- try {
107
- await client.del(`/project-browser-targets/${browser_family}`);
108
- return {
109
- content: [
110
- {
111
- type: "text",
112
- text: `Browser target ${browser_family} removed from project ${project_id}.`,
113
- },
114
- ],
115
- };
116
- }
117
- catch (error) {
118
- const message = error instanceof Error ? error.message : String(error);
119
- return {
120
- content: [
121
- { type: "text", text: `Failed to remove browser target: ${message}` },
122
- ],
123
- isError: true,
124
- };
125
- }
126
- }
127
- return {
128
- content: [
129
- {
130
- type: "text",
131
- text: `Invalid action "${action}". Valid actions: list, add, remove`,
132
- },
133
- ],
134
- isError: true,
135
- };
136
- }
@@ -1,14 +0,0 @@
1
- /**
2
- * percy_manage_comments — List, create, or close comment threads on Percy snapshots.
3
- */
4
- import { BrowserStackConfig } from "../../../lib/types.js";
5
- import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
6
- interface ManageCommentsArgs {
7
- build_id?: string;
8
- snapshot_id?: string;
9
- action?: string;
10
- thread_id?: string;
11
- body?: string;
12
- }
13
- export declare function percyManageComments(args: ManageCommentsArgs, config: BrowserStackConfig): Promise<CallToolResult>;
14
- export {};
@@ -1,147 +0,0 @@
1
- /**
2
- * percy_manage_comments — List, create, or close comment threads on Percy snapshots.
3
- */
4
- import { PercyClient } from "../../../lib/percy-api/client.js";
5
- export async function percyManageComments(args, config) {
6
- const { build_id, snapshot_id, action = "list", thread_id, body } = args;
7
- const client = new PercyClient(config);
8
- // ---- List ----
9
- if (action === "list") {
10
- if (!build_id) {
11
- return {
12
- content: [
13
- { type: "text", text: "build_id is required for the 'list' action." },
14
- ],
15
- isError: true,
16
- };
17
- }
18
- const response = await client.get(`/builds/${build_id}/comment_threads`);
19
- const threads = Array.isArray(response?.data) ? response.data : [];
20
- if (threads.length === 0) {
21
- return {
22
- content: [
23
- { type: "text", text: "_No comment threads for this build._" },
24
- ],
25
- };
26
- }
27
- const lines = [];
28
- lines.push(`## Comment Threads (Build: ${build_id})`);
29
- lines.push("");
30
- for (const thread of threads) {
31
- const attrs = thread.attributes ?? thread;
32
- const id = thread.id ?? "?";
33
- const closed = attrs.closedAt ?? attrs["closed-at"];
34
- const status = closed ? "Closed" : "Open";
35
- const commentCount = attrs.commentsCount ?? attrs["comments-count"] ?? "?";
36
- lines.push(`### Thread #${id} (${status}, ${commentCount} comments)`);
37
- lines.push("");
38
- }
39
- return { content: [{ type: "text", text: lines.join("\n") }] };
40
- }
41
- // ---- Create ----
42
- if (action === "create") {
43
- if (!snapshot_id) {
44
- return {
45
- content: [
46
- {
47
- type: "text",
48
- text: "snapshot_id is required for the 'create' action.",
49
- },
50
- ],
51
- isError: true,
52
- };
53
- }
54
- if (!body) {
55
- return {
56
- content: [
57
- { type: "text", text: "body is required for the 'create' action." },
58
- ],
59
- isError: true,
60
- };
61
- }
62
- const requestBody = {
63
- data: {
64
- type: "comments",
65
- attributes: {
66
- body,
67
- },
68
- relationships: {
69
- snapshot: {
70
- data: { type: "snapshots", id: snapshot_id },
71
- },
72
- },
73
- },
74
- };
75
- try {
76
- const result = (await client.post("/comments", requestBody));
77
- const id = result?.data?.id ?? "?";
78
- return {
79
- content: [
80
- {
81
- type: "text",
82
- text: `Comment created (ID: ${id}) on snapshot ${snapshot_id}.`,
83
- },
84
- ],
85
- };
86
- }
87
- catch (error) {
88
- const message = error instanceof Error ? error.message : String(error);
89
- return {
90
- content: [
91
- { type: "text", text: `Failed to create comment: ${message}` },
92
- ],
93
- isError: true,
94
- };
95
- }
96
- }
97
- // ---- Close ----
98
- if (action === "close") {
99
- if (!thread_id) {
100
- return {
101
- content: [
102
- {
103
- type: "text",
104
- text: "thread_id is required for the 'close' action.",
105
- },
106
- ],
107
- isError: true,
108
- };
109
- }
110
- const requestBody = {
111
- data: {
112
- type: "comment-threads",
113
- id: thread_id,
114
- attributes: {
115
- "closed-at": new Date().toISOString(),
116
- },
117
- },
118
- };
119
- try {
120
- await client.patch(`/comment-threads/${thread_id}`, requestBody);
121
- return {
122
- content: [
123
- {
124
- type: "text",
125
- text: `Comment thread ${thread_id} closed.`,
126
- },
127
- ],
128
- };
129
- }
130
- catch (error) {
131
- const message = error instanceof Error ? error.message : String(error);
132
- return {
133
- content: [{ type: "text", text: `Failed to close thread: ${message}` }],
134
- isError: true,
135
- };
136
- }
137
- }
138
- return {
139
- content: [
140
- {
141
- type: "text",
142
- text: `Invalid action "${action}". Valid actions: list, create, close`,
143
- },
144
- ],
145
- isError: true,
146
- };
147
- }
@@ -1,18 +0,0 @@
1
- /**
2
- * percy_manage_ignored_regions — Create, list, save, or delete ignored regions
3
- * on Percy comparisons.
4
- *
5
- * Supports bounding box (raw), XPath, CSS selector, and fullpage types.
6
- */
7
- import { BrowserStackConfig } from "../../../lib/types.js";
8
- import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
9
- interface ManageIgnoredRegionsArgs {
10
- comparison_id?: string;
11
- action?: string;
12
- region_id?: string;
13
- type?: string;
14
- coordinates?: string;
15
- selector?: string;
16
- }
17
- export declare function percyManageIgnoredRegions(args: ManageIgnoredRegionsArgs, config: BrowserStackConfig): Promise<CallToolResult>;
18
- export {};