From 3668b0cb3461ee1af23d37ff300f5c1961c38051 Mon Sep 17 00:00:00 2001 From: rututaj-browserstack Date: Tue, 20 May 2025 12:30:21 +0530 Subject: [PATCH 1/6] feat: enhance accessibility scan report with issue count and pagination details --- src/tools/accessibility.ts | 7 ++++++- src/tools/accessiblity-utils/report-parser.ts | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/tools/accessibility.ts b/src/tools/accessibility.ts index 4129086..54b4647 100644 --- a/src/tools/accessibility.ts +++ b/src/tools/accessibility.ts @@ -48,7 +48,8 @@ async function runAccessibilityScan( // Fetch CSV report link const reportLink = await reportFetcher.getReportLink(scanId, scanRunId); - const { records } = await parseAccessibilityReportFromCSV(reportLink); + const { records, page_length, total_issues } = + await parseAccessibilityReportFromCSV(reportLink); return { content: [ @@ -56,6 +57,10 @@ async function runAccessibilityScan( type: "text", text: `✅ Accessibility scan "${name}" completed. check the BrowserStack dashboard for more details [https://scanner.browserstack.com/site-scanner/scan-details/${name}].`, }, + { + type: "text", + text: `We found ${total_issues} issues. Below are the details of the ${page_length} most critical issues.`, + }, { type: "text", text: `Scan results: ${JSON.stringify(records, null, 2)}`, diff --git a/src/tools/accessiblity-utils/report-parser.ts b/src/tools/accessiblity-utils/report-parser.ts index 258c1f2..306d126 100644 --- a/src/tools/accessiblity-utils/report-parser.ts +++ b/src/tools/accessiblity-utils/report-parser.ts @@ -20,6 +20,8 @@ type PaginationOptions = { type PaginatedResult = { records: SimplifiedAccessibilityIssue[]; /** Character offset for the next page, or null if done */ + page_length: number; + total_issues: number; next_page: number | null; }; @@ -43,6 +45,8 @@ export async function parseAccessibilityReportFromCSV( severity: (row["Severity"] || "unknown").trim(), })); + const totalIssues = all.length; + // 2) Sort by severity const order: Record = { critical: 0, @@ -70,9 +74,13 @@ export async function parseAccessibilityReportFromCSV( charCursor += recStr.length; } - const hasMore = idx + page.length < all.length; + const pageLength = page.length; + + const hasMore = idx + pageLength < totalIssues; return { records: page, next_page: hasMore ? charCursor : null, + page_length: pageLength, + total_issues: totalIssues, }; } From 4248f3e2925dcdaeedb4c715e3440af98842db01 Mon Sep 17 00:00:00 2001 From: rututaj-browserstack Date: Thu, 22 May 2025 16:18:08 +0530 Subject: [PATCH 2/6] Refactor: Improve formatting and error logging in AccessibilityScanner --- src/lib/local.ts | 39 ++++++++++++------------- src/tools/accessiblity-utils/scanner.ts | 5 ++-- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/lib/local.ts b/src/lib/local.ts index a0faa0d..2472bb2 100644 --- a/src/lib/local.ts +++ b/src/lib/local.ts @@ -73,7 +73,9 @@ export async function killExistingBrowserStackLocalProcesses() { } } -export async function ensureLocalBinarySetup(localIdentifier?: string): Promise { +export async function ensureLocalBinarySetup( + localIdentifier?: string, +): Promise { logger.info( "Ensuring local binary setup as it is required for private URLs...", ); @@ -87,7 +89,7 @@ export async function ensureLocalBinarySetup(localIdentifier?: string): Promise< localIdentifier?: string; } = { key: config.browserstackAccessKey, - username: config.browserstackUsername + username: config.browserstackUsername, }; if (localIdentifier) { @@ -95,25 +97,22 @@ export async function ensureLocalBinarySetup(localIdentifier?: string): Promise< } return await new Promise((resolve, reject) => { - localBinary.start( - requestBody, - (error?: Error) => { - if (error) { - logger.error( - `Unable to start BrowserStack Local... please check your credentials and try again. Error: ${error}`, - ); + localBinary.start(requestBody, (error?: Error) => { + if (error) { + logger.error( + `Unable to start BrowserStack Local... please check your credentials and try again. Error: ${error}`, + ); - reject( - new Error( - `Unable to configure local tunnel binary, please check your credentials and try again. Error: ${error}`, - ), - ); - } else { - logger.info("Successfully started BrowserStack Local"); - resolve(); - } - }, - ); + reject( + new Error( + `Unable to configure local tunnel binary, please check your credentials and try again. Error: ${error}`, + ), + ); + } else { + logger.info("Successfully started BrowserStack Local"); + resolve(); + } + }); }); } diff --git a/src/tools/accessiblity-utils/scanner.ts b/src/tools/accessiblity-utils/scanner.ts index 6da16bc..2c2a5e6 100644 --- a/src/tools/accessiblity-utils/scanner.ts +++ b/src/tools/accessiblity-utils/scanner.ts @@ -29,7 +29,6 @@ export class AccessibilityScanner { name: string, urlList: string[], ): Promise { - // Check if any URL is local const hasLocal = urlList.some(isLocalURL); const localIdentifier = crypto.randomUUID(); @@ -51,7 +50,7 @@ export class AccessibilityScanner { } return url; } catch (e) { - logger.warn(`[AccessibilityScan] Invalid URL skipped: ${url}`); + logger.warn(`[AccessibilityScan] Invalid URL skipped: ${e}`); return url; } }); @@ -68,7 +67,7 @@ export class AccessibilityScanner { localTestingInfo: { localIdentifier, localEnabled: true, - } + }, }; requestBody = { ...baseRequestBody, ...localConfig }; } From 42f16c71a4994acdc81bdd13cda1c4e72e3d6b07 Mon Sep 17 00:00:00 2001 From: rututaj-browserstack Date: Thu, 22 May 2025 16:49:44 +0530 Subject: [PATCH 3/6] Refactor: Replace hardcoded local IP with a set of local hostnames in AccessibilityScanner --- src/tools/accessiblity-utils/scanner.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tools/accessiblity-utils/scanner.ts b/src/tools/accessiblity-utils/scanner.ts index 2c2a5e6..550f0a9 100644 --- a/src/tools/accessiblity-utils/scanner.ts +++ b/src/tools/accessiblity-utils/scanner.ts @@ -32,7 +32,7 @@ export class AccessibilityScanner { // Check if any URL is local const hasLocal = urlList.some(isLocalURL); const localIdentifier = crypto.randomUUID(); - const LOCAL_IP = "127.0.0.1"; + const localHosts = new Set(["127.0.0.1", "localhost"]); const BS_LOCAL_DOMAIN = "bs-local.com"; if (hasLocal) { @@ -44,7 +44,7 @@ export class AccessibilityScanner { const transformedUrlList = urlList.map((url) => { try { const parsed = new URL(url); - if (parsed.hostname === LOCAL_IP) { + if (localHosts.has(parsed.hostname)) { parsed.hostname = BS_LOCAL_DOMAIN; return parsed.toString(); } From a0b02e2e86ce13917b945c49d06a25a3eff672fe Mon Sep 17 00:00:00 2001 From: rututaj-browserstack Date: Thu, 22 May 2025 18:15:32 +0530 Subject: [PATCH 4/6] Fix: Add '0.0.0.0' to local hosts in AccessibilityScanner --- src/tools/accessiblity-utils/scanner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/accessiblity-utils/scanner.ts b/src/tools/accessiblity-utils/scanner.ts index 550f0a9..18b09cc 100644 --- a/src/tools/accessiblity-utils/scanner.ts +++ b/src/tools/accessiblity-utils/scanner.ts @@ -32,7 +32,7 @@ export class AccessibilityScanner { // Check if any URL is local const hasLocal = urlList.some(isLocalURL); const localIdentifier = crypto.randomUUID(); - const localHosts = new Set(["127.0.0.1", "localhost"]); + const localHosts = new Set(["127.0.0.1", "localhost","0.0.0.0"]); const BS_LOCAL_DOMAIN = "bs-local.com"; if (hasLocal) { From b8d477627ea8f7e2f9f356f09e43654137f583a9 Mon Sep 17 00:00:00 2001 From: rututaj-browserstack Date: Thu, 22 May 2025 18:33:49 +0530 Subject: [PATCH 5/6] Bump version to 1.1.4 in package.json and package-lock.json --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0960be..292fa47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@browserstack/mcp-server", - "version": "1.1.3", + "version": "1.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@browserstack/mcp-server", - "version": "1.1.3", + "version": "1.1.4", "license": "ISC", "dependencies": { "@modelcontextprotocol/sdk": "^1.11.4", diff --git a/package.json b/package.json index d6a758c..f9da64e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@browserstack/mcp-server", - "version": "1.1.3", + "version": "1.1.4", "description": "BrowserStack's Official MCP Server", "main": "dist/index.js", "repository": { From 131150b97b9814bc6406b3094f551fdbd1459e6d Mon Sep 17 00:00:00 2001 From: rututaj-browserstack Date: Thu, 22 May 2025 18:34:54 +0530 Subject: [PATCH 6/6] Fix: Improve formatting of localHosts declaration in AccessibilityScanner --- src/tools/accessiblity-utils/scanner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/accessiblity-utils/scanner.ts b/src/tools/accessiblity-utils/scanner.ts index 18b09cc..eb9a6da 100644 --- a/src/tools/accessiblity-utils/scanner.ts +++ b/src/tools/accessiblity-utils/scanner.ts @@ -32,7 +32,7 @@ export class AccessibilityScanner { // Check if any URL is local const hasLocal = urlList.some(isLocalURL); const localIdentifier = crypto.randomUUID(); - const localHosts = new Set(["127.0.0.1", "localhost","0.0.0.0"]); + const localHosts = new Set(["127.0.0.1", "localhost", "0.0.0.0"]); const BS_LOCAL_DOMAIN = "bs-local.com"; if (hasLocal) {