1- import { ToolBase , ToolCategory } from "../tool.js" ;
1+ import { ToolBase , ToolCategory , TelemetryToolMetadata } from "../tool.js" ;
2+ import { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js" ;
3+ import logger , { LogId } from "../../logger.js" ;
4+ import { z } from "zod" ;
25
36export abstract class AtlasToolBase extends ToolBase {
47 protected category : ToolCategory = "atlas" ;
@@ -9,4 +12,46 @@ export abstract class AtlasToolBase extends ToolBase {
912 }
1013 return super . verifyAllowed ( ) ;
1114 }
15+
16+ /**
17+ *
18+ * Resolves the tool metadata from the arguments passed to the tool
19+ *
20+ * @param args - The arguments passed to the tool
21+ * @returns The tool metadata
22+ */
23+ protected resolveTelemetryMetadata (
24+ ...args : Parameters < ToolCallback < typeof this . argsShape > >
25+ ) : TelemetryToolMetadata {
26+ const toolMetadata : TelemetryToolMetadata = { } ;
27+ if ( ! args . length ) {
28+ return toolMetadata ;
29+ }
30+
31+ // Create a typed parser for the exact shape we expect
32+ const argsShape = z . object ( this . argsShape ) ;
33+ const parsedResult = argsShape . safeParse ( args [ 0 ] ) ;
34+
35+ if ( ! parsedResult . success ) {
36+ logger . debug (
37+ LogId . telemetryMetadataError ,
38+ "tool" ,
39+ `Error parsing tool arguments: ${ parsedResult . error . message } `
40+ ) ;
41+ return toolMetadata ;
42+ }
43+
44+ const data = parsedResult . data ;
45+
46+ // Extract projectId using type guard
47+ if ( "projectId" in data && typeof data . projectId === "string" && data . projectId . trim ( ) !== "" ) {
48+ toolMetadata . projectId = data . projectId ;
49+ }
50+
51+ // Extract orgId using type guard
52+ if ( "orgId" in data && typeof data . orgId === "string" && data . orgId . trim ( ) !== "" ) {
53+ toolMetadata . orgId = data . orgId ;
54+ }
55+ return toolMetadata ;
56+ }
1257}
0 commit comments