Skip to content

Commit 93e431b

Browse files
committed
Feat: Enhance MCP event tracking
1 parent 03ebc05 commit 93e431b

File tree

9 files changed

+32
-25
lines changed

9 files changed

+32
-25
lines changed

src/index.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import addBrowserLiveTools from "./tools/live";
1212
import addAccessibilityTools from "./tools/accessibility";
1313
import addAutomateTools from "./tools/automate";
1414
import addTestManagementTools from "./tools/testmanagement";
15-
import { createCustomInitializeHandler } from "./lib/utils";
1615

1716
function registerTools(server: McpServer) {
1817
addSDKTools(server);
@@ -32,18 +31,6 @@ const server: McpServer = new McpServer({
3231

3332
registerTools(server);
3433

35-
let clientName: string | undefined;
36-
37-
function setClientName(name: string) {
38-
clientName = name;
39-
}
40-
41-
const origInitializeHandler =
42-
server.server["_requestHandlers"].get("initialize");
43-
server.server["_requestHandlers"].set(
44-
"initialize",
45-
createCustomInitializeHandler(origInitializeHandler, logger, setClientName),
46-
);
4734

4835
async function main() {
4936
logger.info(
@@ -65,4 +52,3 @@ process.on("exit", () => {
6552
logger.flush();
6653
});
6754

68-
export { clientName };

src/lib/instrumentation.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import logger from "../logger";
22
import config from "../config";
33
import packageJson from "../../package.json";
44
import axios from "axios";
5-
import { clientName } from "../index";
65

76
interface MCPEventPayload {
87
event_type: string;
@@ -13,9 +12,20 @@ interface MCPEventPayload {
1312
};
1413
}
1514

16-
export function trackMCPEvent(toolName: string): void {
15+
export function trackMCPEvent(
16+
toolName: string,
17+
clientInfo: { name?: string; version?: string },
18+
): void {
1719
const instrumentationEndpoint = "https://api.browserstack.com/sdk/v1/event";
18-
const mcpClient = clientName || "unknown";
20+
21+
const mcpClient = clientInfo?.name || "unknown";
22+
if (clientInfo?.name) {
23+
logger.info(
24+
`Client connected: ${clientInfo.name} (version: ${clientInfo.version})`,
25+
);
26+
} else {
27+
logger.info("Client connected: unknown client");
28+
}
1929

2030
const event: MCPEventPayload = {
2131
event_type: "MCPInstrumentation",

src/tools/accessibility.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ export default function addAccessibilityTools(server: McpServer) {
5656
pageURL: z.string().describe("The URL to scan for accessibility issues"),
5757
},
5858
async (args) => {
59-
trackMCPEvent("startAccessibilityScan");
59+
const clientInfo = server.server.getClientVersion();
60+
trackMCPEvent("startAccessibilityScan", clientInfo!);
6061
return runAccessibilityScan(args.name, args.pageURL);
6162
},
6263
);

src/tools/applive.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ export default function addAppLiveTools(server: McpServer) {
9090
},
9191
async (args) => {
9292
try {
93-
trackMCPEvent("runAppLiveSession");
93+
const clientInfo = server.server.getClientVersion();
94+
trackMCPEvent("runAppLiveSession", clientInfo!);
9495
return startAppLiveSession(args);
9596
} catch (error) {
9697
return {

src/tools/automate.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ export default function addAutomateTools(server: McpServer) {
5959
sessionId: z.string().describe("The Automate session ID."),
6060
},
6161
async (args) => {
62-
trackMCPEvent("getNetworkFailures");
62+
const clientInfo = server.server.getClientVersion();
63+
trackMCPEvent("startAccessibilityScan", clientInfo!);
6364
return getNetworkFailures(args);
6465
},
6566
);

src/tools/bstack-sdk.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ export default function addSDKTools(server: McpServer) {
8181
const desiredPlatforms = args.desiredPlatforms;
8282

8383
try {
84-
trackMCPEvent("runTestsOnBrowserStack");
84+
const clientInfo = server.server.getClientVersion();
85+
trackMCPEvent("runTestsOnBrowserStack", clientInfo!);
8586
return bootstrapProjectWithSDK({
8687
detectedBrowserAutomationFramework,
8788
detectedTestingFramework,

src/tools/live.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ export default function addBrowserLiveTools(server: McpServer) {
119119
LiveArgsShape,
120120
async (args) => {
121121
try {
122-
trackMCPEvent("runBrowserLiveSession");
122+
const clientInfo = server.server.getClientVersion();
123+
trackMCPEvent("runBrowserLiveSession", clientInfo!);
123124
const result = await runBrowserSession(args);
124125
return result;
125126
} catch (error: any) {

src/tools/observability.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export default function addObservabilityTools(server: McpServer) {
5858
},
5959
async (args) => {
6060
try {
61-
trackMCPEvent("getFailuresInLastRun");
61+
const clientInfo = server.server.getClientVersion();
62+
trackMCPEvent("getFailuresInLastRun", clientInfo!);
6263
return getFailuresInLastRun(args.buildName, args.projectName);
6364
} catch (error) {
6465
return {

src/tools/testmanagement.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ import {
1313
CreateTestCaseSchema,
1414
} from "./testmanagement-utils/create-testcase";
1515

16+
let serverInstance: McpServer;
17+
1618
/**
1719
* Wrapper to call createProjectOrFolder util.
1820
*/
1921
export async function createProjectOrFolderTool(
2022
args: z.infer<typeof CreateProjFoldSchema>,
2123
): Promise<CallToolResult> {
2224
try {
23-
trackMCPEvent("createProjectOrFolder");
25+
const clientInfo = serverInstance.server.getClientVersion();
26+
trackMCPEvent("createProjectOrFolder", clientInfo!);
2427
return await createProjectOrFolder(args);
2528
} catch (err) {
2629
return {
@@ -47,7 +50,8 @@ export async function createTestCaseTool(
4750
// Sanitize input arguments
4851
const cleanedArgs = sanitizeArgs(args);
4952
try {
50-
trackMCPEvent("createTestCase");
53+
const clientInfo = serverInstance.server.getClientVersion();
54+
trackMCPEvent("createTestCase", clientInfo!);
5155
return await createTestCaseAPI(cleanedArgs);
5256
} catch (err) {
5357
return {
@@ -69,6 +73,7 @@ export async function createTestCaseTool(
6973
* Registers both project/folder and test-case tools.
7074
*/
7175
export default function addTestManagementTools(server: McpServer) {
76+
serverInstance = server;
7277
server.tool(
7378
"createProjectOrFolder",
7479
"Create a project and/or folder in BrowserStack Test Management.",

0 commit comments

Comments
 (0)