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

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
@@ -4,6 +4,7 @@ import { createProjectOrFolder, CreateProjFoldSchema, } from "./testmanagement-u
4
4
  import { createTestCase as createTestCaseAPI, sanitizeArgs, CreateTestCaseSchema, } from "./testmanagement-utils/create-testcase.js";
5
5
  import { updateTestCase as updateTestCaseAPI, UpdateTestCaseSchema, } from "./testmanagement-utils/update-testcase.js";
6
6
  import { listTestCases, ListTestCasesSchema, } from "./testmanagement-utils/list-testcases.js";
7
+ import { listFolders, ListFoldersSchema, } from "./testmanagement-utils/list-folders.js";
7
8
  import { CreateTestRunSchema, createTestRun, } from "./testmanagement-utils/create-testrun.js";
8
9
  import { ListTestRunsSchema, listTestRuns, } from "./testmanagement-utils/list-testruns.js";
9
10
  import { UpdateTestRunSchema, updateTestRun, } from "./testmanagement-utils/update-testrun.js";
@@ -12,6 +13,8 @@ import { UploadFileSchema, uploadFile, } from "./testmanagement-utils/upload-fil
12
13
  import { createTestCasesFromFile } from "./testmanagement-utils/testcase-from-file.js";
13
14
  import { CreateTestCasesFromFileSchema } from "./testmanagement-utils/TCG-utils/types.js";
14
15
  import { createLCASteps, CreateLCAStepsSchema, } from "./testmanagement-utils/create-lca-steps.js";
16
+ import { listTestPlans, ListTestPlansSchema, } from "./testmanagement-utils/list-testplans.js";
17
+ import { getTestPlan, GetTestPlanSchema, } from "./testmanagement-utils/get-testplan.js";
15
18
  //TODO: Moving the traceMCP and catch block to the parent(server) function
16
19
  /**
17
20
  * Wrapper to call createProjectOrFolder util.
@@ -102,6 +105,27 @@ export async function listTestCasesTool(args, config, server) {
102
105
  };
103
106
  }
104
107
  }
108
+ /**
109
+ * Lists folders in a project (or sub-folders under a parent folder).
110
+ */
111
+ export async function listFoldersTool(args, config, server) {
112
+ try {
113
+ trackMCP("listFolders", server.server.getClientVersion(), undefined, config);
114
+ return await listFolders(args, config);
115
+ }
116
+ catch (err) {
117
+ trackMCP("listFolders", server.server.getClientVersion(), err, config);
118
+ return {
119
+ content: [
120
+ {
121
+ type: "text",
122
+ text: `Failed to list folders: ${err instanceof Error ? err.message : "Unknown error"}. Please open an issue on GitHub if the problem persists`,
123
+ },
124
+ ],
125
+ isError: true,
126
+ };
127
+ }
128
+ }
105
129
  /**
106
130
  * Creates a test run in BrowserStack Test Management.
107
131
  */
@@ -251,6 +275,50 @@ export async function createLCAStepsTool(args, context, config, server) {
251
275
  };
252
276
  }
253
277
  }
278
+ /**
279
+ * Lists test plans in a project.
280
+ */
281
+ export async function listTestPlansTool(args, config, server) {
282
+ try {
283
+ trackMCP("listTestPlans", server.server.getClientVersion(), undefined, config);
284
+ return await listTestPlans(args, config);
285
+ }
286
+ catch (err) {
287
+ logger.error("Failed to list test plans: %s", err);
288
+ trackMCP("listTestPlans", server.server.getClientVersion(), err, config);
289
+ return {
290
+ content: [
291
+ {
292
+ type: "text",
293
+ text: `Failed to list test plans: ${err instanceof Error ? err.message : "Unknown error"}. Please open an issue on GitHub if the problem persists`,
294
+ },
295
+ ],
296
+ isError: true,
297
+ };
298
+ }
299
+ }
300
+ /**
301
+ * Fetches a test plan by identifier, with its linked runs and a derived status summary.
302
+ */
303
+ export async function getTestPlanTool(args, config, server) {
304
+ try {
305
+ trackMCP("getTestPlan", server.server.getClientVersion(), undefined, config);
306
+ return await getTestPlan(args, config);
307
+ }
308
+ catch (err) {
309
+ logger.error("Failed to fetch test plan: %s", err);
310
+ trackMCP("getTestPlan", server.server.getClientVersion(), err, config);
311
+ return {
312
+ content: [
313
+ {
314
+ type: "text",
315
+ text: `Failed to fetch test plan: ${err instanceof Error ? err.message : "Unknown error"}. Please open an issue on GitHub if the problem persists`,
316
+ },
317
+ ],
318
+ isError: true,
319
+ };
320
+ }
321
+ }
254
322
  /**
255
323
  * Registers both project/folder and test-case tools.
256
324
  */
@@ -258,8 +326,9 @@ export default function addTestManagementTools(server, config) {
258
326
  const tools = {};
259
327
  tools.createProjectOrFolder = server.tool("createProjectOrFolder", "Create a project and/or folder in BrowserStack Test Management.", CreateProjFoldSchema.shape, (args) => createProjectOrFolderTool(args, config, server));
260
328
  tools.createTestCase = server.tool("createTestCase", "Use this tool to create a test case in BrowserStack Test Management.", CreateTestCaseSchema.shape, (args) => createTestCaseTool(args, config, server));
261
- tools.updateTestCase = server.tool("updateTestCase", "Use this tool to update an existing test case in BrowserStack Test Management. Allows editing test case details like name, description, steps, owner, priority, and more.", UpdateTestCaseSchema.shape, (args) => updateTestCaseTool(args, config, server));
262
- tools.listTestCases = server.tool("listTestCases", "List test cases in a project with optional filters (status, priority, custom fields, etc.)", ListTestCasesSchema.shape, (args) => listTestCasesTool(args, config, server));
329
+ tools.updateTestCase = server.tool("updateTestCase", "Update an existing test case in BrowserStack Test Management. Any subset of the following fields may be changed: name, description, preconditions, test_case_steps, owner, priority, case_type, automation_status, status, tags, issues, custom_fields. Only the supplied fields are modified.", UpdateTestCaseSchema.shape, (args) => updateTestCaseTool(args, config, server));
330
+ tools.listTestCases = server.tool("listTestCases", "List test cases in a project, optionally scoped to a specific folder. Omit folder_id to list all test cases in the project; provide folder_id (discoverable via listFolders) to list only that folder's cases. Supports filters: case_type, priority, pagination.", ListTestCasesSchema.shape, (args) => listTestCasesTool(args, config, server));
331
+ tools.listFolders = server.tool("listFolders", "List folders in a BrowserStack Test Management project, returning each folder's id and name (plus case counts and sub-folder counts). Pass parent_id to list sub-folders under a specific folder instead of top-level folders.", ListFoldersSchema.shape, (args) => listFoldersTool(args, config, server));
263
332
  tools.createTestRun = server.tool("createTestRun", "Create a test run in BrowserStack Test Management.", CreateTestRunSchema.shape, (args) => createTestRunTool(args, config, server));
264
333
  tools.listTestRuns = server.tool("listTestRuns", "List test runs in a project with optional filters (date ranges, assignee, state, etc.)", ListTestRunsSchema.shape, (args) => listTestRunsTool(args, config, server));
265
334
  tools.updateTestRun = server.tool("updateTestRun", "Update a test run in BrowserStack Test Management.", UpdateTestRunSchema.shape, (args) => updateTestRunTool(args, config, server));
@@ -267,5 +336,7 @@ export default function addTestManagementTools(server, config) {
267
336
  tools.uploadProductRequirementFile = server.tool("uploadProductRequirementFile", "Upload files (e.g., PDRs, PDFs) to BrowserStack Test Management and retrieve a file mapping ID. This is utilized for generating test cases from files and is part of the Test Case Generator AI Agent in BrowserStack.", UploadFileSchema.shape, (args) => uploadProductRequirementFileTool(args, config, server));
268
337
  tools.createTestCasesFromFile = server.tool("createTestCasesFromFile", "Generate test cases from a file in BrowserStack Test Management using the Test Case Generator AI Agent.", CreateTestCasesFromFileSchema.shape, (args, context) => createTestCasesFromFileTool(args, context, config, server));
269
338
  tools.createLCASteps = server.tool("createLCASteps", "Generate Low Code Automation (LCA) steps for a test case in BrowserStack Test Management using the Low Code Automation Agent.", CreateLCAStepsSchema.shape, (args, context) => createLCAStepsTool(args, context, config, server));
339
+ tools.listTestPlans = server.tool("listTestPlans", "List test plans in a BrowserStack Test Management project. Returns each plan's identifier (TP-*), name, status, description, dates, and active/closed test-run counts. Supports pagination.", ListTestPlansSchema.shape, (args) => listTestPlansTool(args, config, server));
340
+ tools.getTestPlan = server.tool("getTestPlan", "Fetch a test plan by identifier (TP-*) from BrowserStack Test Management. Returns plan metadata, the full list of linked test runs, total test-case count across runs, and a status summary — suitable for generating test documentation or QA status reports.", GetTestPlanSchema.shape, (args) => getTestPlanTool(args, config, server));
270
341
  return tools;
271
342
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@browserstack/mcp-server",
3
- "version": "1.2.15-beta.2",
3
+ "version": "1.2.16",
4
4
  "description": "BrowserStack's Official MCP Server",
5
5
  "mcpName": "io.github.browserstack/mcp-server",
6
6
  "main": "dist/index.js",
@@ -15,8 +15,7 @@
15
15
  "dev": "tsx watch --clear-screen=false src/index.ts",
16
16
  "test": "vitest run",
17
17
  "lint": "eslint . --ext .ts",
18
- "format": "prettier --write \"src/**/*.ts\"",
19
- "generate-app-samples": "node scripts/generate-app-samples.mjs"
18
+ "format": "prettier --write \"src/**/*.ts\""
20
19
  },
21
20
  "bin": {
22
21
  "browserstack-mcp-server": "dist/index.js"
@@ -1,41 +0,0 @@
1
- /**
2
- * Percy API authentication module.
3
- * Resolves Percy tokens via environment variables or BrowserStack credential fallback.
4
- *
5
- * SECURITY: Token values are NEVER logged or included in error messages.
6
- * Masked format (****<last4>) is used when referencing tokens in diagnostics.
7
- */
8
- import { BrowserStackConfig } from "../types.js";
9
- type TokenScope = "project" | "org" | "auto";
10
- interface ResolveTokenOptions {
11
- projectName?: string;
12
- scope?: TokenScope;
13
- }
14
- /**
15
- * Masks a token for safe display in error messages.
16
- * Shows only the last 4 characters.
17
- */
18
- export declare function maskToken(token: string): string;
19
- /**
20
- * Resolves a Percy token using the following priority:
21
- *
22
- * 1. `process.env.PERCY_TOKEN` (for project or auto scope)
23
- * 2. `process.env.PERCY_ORG_TOKEN` (for org scope)
24
- * 3. Fallback: fetch via BrowserStack API using `fetchPercyToken()`
25
- * 4. If nothing works, throws an enriched error with guidance
26
- */
27
- export declare function resolvePercyToken(config: BrowserStackConfig, options?: ResolveTokenOptions): Promise<string>;
28
- /**
29
- * Returns headers for Percy API requests.
30
- * Includes Authorization, Content-Type, and User-Agent.
31
- */
32
- export declare function getPercyHeaders(config: BrowserStackConfig, options?: {
33
- scope?: TokenScope;
34
- projectName?: string;
35
- }): Promise<Record<string, string>>;
36
- /**
37
- * Returns the Percy API base URL.
38
- * Defaults to `https://percy.io/api/v1`, overridable via `PERCY_API_URL` env var.
39
- */
40
- export declare function getPercyApiBaseUrl(): string;
41
- export {};
@@ -1,96 +0,0 @@
1
- /**
2
- * Percy API authentication module.
3
- * Resolves Percy tokens via environment variables or BrowserStack credential fallback.
4
- *
5
- * SECURITY: Token values are NEVER logged or included in error messages.
6
- * Masked format (****<last4>) is used when referencing tokens in diagnostics.
7
- */
8
- import { fetchPercyToken } from "../../tools/sdk-utils/percy-web/fetchPercyToken.js";
9
- /**
10
- * Masks a token for safe display in error messages.
11
- * Shows only the last 4 characters.
12
- */
13
- export function maskToken(token) {
14
- if (token.length <= 4) {
15
- return "****";
16
- }
17
- return `****${token.slice(-4)}`;
18
- }
19
- /**
20
- * Resolves a Percy token using the following priority:
21
- *
22
- * 1. `process.env.PERCY_TOKEN` (for project or auto scope)
23
- * 2. `process.env.PERCY_ORG_TOKEN` (for org scope)
24
- * 3. Fallback: fetch via BrowserStack API using `fetchPercyToken()`
25
- * 4. If nothing works, throws an enriched error with guidance
26
- */
27
- export async function resolvePercyToken(config, options = {}) {
28
- const { projectName, scope = "auto" } = options;
29
- // For project or auto scope, check PERCY_TOKEN first
30
- if (scope === "project" || scope === "auto") {
31
- const envToken = process.env.PERCY_TOKEN;
32
- if (envToken) {
33
- return envToken;
34
- }
35
- }
36
- // For org scope, check PERCY_ORG_TOKEN
37
- if (scope === "org") {
38
- const orgToken = process.env.PERCY_ORG_TOKEN;
39
- if (orgToken) {
40
- return orgToken;
41
- }
42
- }
43
- // For auto scope, also check PERCY_ORG_TOKEN as secondary
44
- if (scope === "auto") {
45
- const orgToken = process.env.PERCY_ORG_TOKEN;
46
- if (orgToken) {
47
- return orgToken;
48
- }
49
- }
50
- // Fallback: fetch via BrowserStack credentials
51
- const username = config["browserstack-username"];
52
- const accessKey = config["browserstack-access-key"];
53
- if (username && accessKey) {
54
- const auth = `${username}:${accessKey}`;
55
- const resolvedProjectName = projectName || "default";
56
- try {
57
- const token = await fetchPercyToken(resolvedProjectName, auth, {});
58
- return token;
59
- }
60
- catch (error) {
61
- const message = error instanceof Error ? error.message : String(error);
62
- throw new Error(`Failed to fetch Percy token via BrowserStack API: ${message}. ` +
63
- `Set PERCY_TOKEN or PERCY_ORG_TOKEN environment variable as an alternative.`);
64
- }
65
- }
66
- // Nothing worked — provide actionable guidance
67
- if (scope === "project") {
68
- throw new Error("Percy project token not available. Set PERCY_TOKEN environment variable, " +
69
- "or provide BrowserStack credentials to fetch a token automatically.");
70
- }
71
- if (scope === "org") {
72
- throw new Error("Percy org token not available. Set PERCY_ORG_TOKEN environment variable.");
73
- }
74
- throw new Error("Percy token not available. Set PERCY_TOKEN (project) or PERCY_ORG_TOKEN (org) " +
75
- "environment variable, or provide BrowserStack credentials (browserstack-username " +
76
- "and browserstack-access-key) to fetch a token automatically.");
77
- }
78
- /**
79
- * Returns headers for Percy API requests.
80
- * Includes Authorization, Content-Type, and User-Agent.
81
- */
82
- export async function getPercyHeaders(config, options = {}) {
83
- const token = await resolvePercyToken(config, options);
84
- return {
85
- Authorization: `Token token=${token}`,
86
- "Content-Type": "application/json",
87
- "User-Agent": "browserstack-mcp-server",
88
- };
89
- }
90
- /**
91
- * Returns the Percy API base URL.
92
- * Defaults to `https://percy.io/api/v1`, overridable via `PERCY_API_URL` env var.
93
- */
94
- export function getPercyApiBaseUrl() {
95
- return process.env.PERCY_API_URL || "https://percy.io/api/v1";
96
- }
@@ -1,28 +0,0 @@
1
- /**
2
- * Simple in-memory cache with per-entry TTL.
3
- *
4
- * Used to cache Percy API responses and avoid redundant network calls
5
- * within short time windows (e.g., multiple tools querying the same build).
6
- */
7
- export declare class PercyCache {
8
- private store;
9
- /**
10
- * Returns the cached value if it exists and has not expired.
11
- * Expired entries are deleted on access.
12
- */
13
- get<T>(key: string): T | null;
14
- /**
15
- * Stores a value with an optional TTL (defaults to 30 seconds).
16
- */
17
- set(key: string, value: unknown, ttlMs?: number): void;
18
- /**
19
- * Removes all entries from the cache.
20
- */
21
- clear(): void;
22
- /**
23
- * Removes a single entry from the cache.
24
- */
25
- delete(key: string): void;
26
- }
27
- /** Singleton cache instance shared across Percy API tools. */
28
- export declare const percyCache: PercyCache;
@@ -1,48 +0,0 @@
1
- /**
2
- * Simple in-memory cache with per-entry TTL.
3
- *
4
- * Used to cache Percy API responses and avoid redundant network calls
5
- * within short time windows (e.g., multiple tools querying the same build).
6
- */
7
- const DEFAULT_TTL_MS = 30_000; // 30 seconds
8
- export class PercyCache {
9
- store = new Map();
10
- /**
11
- * Returns the cached value if it exists and has not expired.
12
- * Expired entries are deleted on access.
13
- */
14
- get(key) {
15
- const entry = this.store.get(key);
16
- if (!entry) {
17
- return null;
18
- }
19
- if (Date.now() > entry.expiresAt) {
20
- this.store.delete(key);
21
- return null;
22
- }
23
- return entry.value;
24
- }
25
- /**
26
- * Stores a value with an optional TTL (defaults to 30 seconds).
27
- */
28
- set(key, value, ttlMs = DEFAULT_TTL_MS) {
29
- this.store.set(key, {
30
- value,
31
- expiresAt: Date.now() + ttlMs,
32
- });
33
- }
34
- /**
35
- * Removes all entries from the cache.
36
- */
37
- clear() {
38
- this.store.clear();
39
- }
40
- /**
41
- * Removes a single entry from the cache.
42
- */
43
- delete(key) {
44
- this.store.delete(key);
45
- }
46
- }
47
- /** Singleton cache instance shared across Percy API tools. */
48
- export const percyCache = new PercyCache();
@@ -1,69 +0,0 @@
1
- /**
2
- * Percy API HTTP client.
3
- *
4
- * Uses native `fetch` (consistent with existing Percy tools in this repo).
5
- * Handles JSON:API deserialization, rate limiting, and error enrichment.
6
- *
7
- * SECURITY: Token values are NEVER logged or exposed in error messages.
8
- */
9
- import { BrowserStackConfig } from "../types.js";
10
- type TokenScope = "project" | "org" | "auto";
11
- interface ClientOptions {
12
- scope?: TokenScope;
13
- projectName?: string;
14
- }
15
- interface JsonApiResource {
16
- id: string;
17
- type: string;
18
- attributes?: Record<string, unknown>;
19
- relationships?: Record<string, {
20
- data: {
21
- id: string;
22
- type: string;
23
- } | Array<{
24
- id: string;
25
- type: string;
26
- }> | null;
27
- }>;
28
- }
29
- interface JsonApiEnvelope {
30
- data: JsonApiResource | JsonApiResource[] | null;
31
- included?: JsonApiResource[];
32
- meta?: Record<string, unknown>;
33
- }
34
- /**
35
- * Deserializes a JSON:API envelope into plain objects.
36
- *
37
- * - `data: null` → returns `null`
38
- * - `data: []` → returns `[]`
39
- * - `data: { ... }` → returns a single deserialized object
40
- * - `data: [{ ... }, ...]` → returns an array of deserialized objects
41
- */
42
- export declare function deserialize(envelope: JsonApiEnvelope): {
43
- data: Record<string, unknown> | Record<string, unknown>[] | null;
44
- meta?: Record<string, unknown>;
45
- };
46
- export declare class PercyClient {
47
- private config;
48
- private options;
49
- constructor(config: BrowserStackConfig, options?: ClientOptions);
50
- /**
51
- * GET request with optional query params and JSON:API `include`.
52
- */
53
- get<T = Record<string, unknown>>(path: string, params?: Record<string, string>, includes?: string[]): Promise<T>;
54
- /**
55
- * POST request with an optional JSON body.
56
- */
57
- post<T = Record<string, unknown>>(path: string, body?: unknown): Promise<T>;
58
- /**
59
- * PATCH request with an optional JSON body.
60
- */
61
- patch<T = Record<string, unknown>>(path: string, body?: unknown): Promise<T>;
62
- /**
63
- * DELETE request.
64
- */
65
- del(path: string): Promise<void>;
66
- private buildUrl;
67
- private request;
68
- }
69
- export {};