11import { Features } from '../../../types'
22import { MCP_SERVER_STATUS_CHANGED , McpManager } from './mcpManager'
3+ import { ChatTelemetryController } from '../../../chat/telemetry/chatTelemetryController'
34import {
45 DetailedListGroup ,
56 DetailedListItem ,
@@ -22,6 +23,7 @@ import {
2223 McpServerRuntimeState ,
2324 McpServerStatus ,
2425} from './mcpTypes'
26+ import { TelemetryService } from '../../../../shared/telemetry/telemetryService'
2527
2628interface PermissionOption {
2729 label : string
@@ -33,12 +35,14 @@ export class McpEventHandler {
3335 #eventListenerRegistered: boolean
3436 #currentEditingServerName: string | undefined
3537 #shouldDisplayListMCPServers: boolean
38+ #telemetryController: ChatTelemetryController
3639
37- constructor ( features : Features ) {
40+ constructor ( features : Features , telemetryService : TelemetryService ) {
3841 this . #features = features
3942 this . #eventListenerRegistered = false
4043 this . #currentEditingServerName = undefined
4144 this . #shouldDisplayListMCPServers = true
45+ this . #telemetryController = new ChatTelemetryController ( features , telemetryService )
4246 }
4347
4448 /**
@@ -635,9 +639,28 @@ export class McpEventHandler {
635639 if ( isEditMode && originalServerName ) {
636640 await McpManager . instance . removeServer ( originalServerName )
637641 await McpManager . instance . addServer ( serverName , config , configPath , personaPath )
642+ // Emit server initialize event after updating server
643+ this . #telemetryController?. emitMCPServerInitializeEvent ( {
644+ source : 'updateServer' ,
645+ command : config . command ,
646+ enabled : true ,
647+ numTools : McpManager . instance . getAllToolsWithPermissions ( serverName ) . length ,
648+ scope : params . optionsValues [ 'scope' ] === 'global' ? 'global' : 'workspace' ,
649+ transportType : 'stdio' ,
650+ languageServerVersion : this . #features. runtime . serverInfo . version ,
651+ } )
638652 } else {
639653 // Create new server
640654 await McpManager . instance . addServer ( serverName , config , configPath , personaPath )
655+ this . #telemetryController?. emitMCPServerInitializeEvent ( {
656+ source : 'addServer' ,
657+ command : config . command ,
658+ enabled : true ,
659+ numTools : McpManager . instance . getAllToolsWithPermissions ( serverName ) . length ,
660+ scope : params . optionsValues [ 'scope' ] === 'global' ? 'global' : 'workspace' ,
661+ transportType : 'stdio' ,
662+ languageServerVersion : this . #features. runtime . serverInfo . version ,
663+ } )
641664 }
642665
643666 this . #currentEditingServerName = undefined
@@ -973,20 +996,99 @@ export class McpEventHandler {
973996 const mcpServerPermission = await this . #processPermissionUpdates( updatedPermissionConfig )
974997
975998 await McpManager . instance . updateServerPermission ( serverName , mcpServerPermission )
999+
1000+ // Get server config to emit telemetry
1001+ const serverConfig = McpManager . instance . getAllServerConfigs ( ) . get ( serverName )
1002+ if ( serverConfig ) {
1003+ // Emit server initialize event after permission change
1004+ this . #telemetryController?. emitMCPServerInitializeEvent ( {
1005+ source : 'updatePermission' ,
1006+ command : serverConfig . command ,
1007+ enabled : true ,
1008+ numTools : McpManager . instance . getAllToolsWithPermissions ( serverName ) . length ,
1009+ scope :
1010+ serverConfig ?. __configPath__ ===
1011+ getGlobalMcpConfigPath ( this . #features. workspace . fs . getUserHomeDir ( ) )
1012+ ? 'global'
1013+ : 'workspace' ,
1014+ transportType : 'stdio' ,
1015+ languageServerVersion : this . #features. runtime . serverInfo . version ,
1016+ } )
1017+ }
9761018 return { id : params . id }
9771019 } catch ( error ) {
9781020 this . #features. logging . error ( `Failed to update MCP permissions: ${ error } ` )
9791021 return { id : params . id }
9801022 }
9811023 }
9821024
1025+ #emitMCPConfigEvent( ) {
1026+ // Emit MCP config event after reinitialization
1027+ const mcpManager = McpManager . instance
1028+ const serverConfigs = mcpManager . getAllServerConfigs ( )
1029+ const activeServers = Array . from ( serverConfigs . entries ( ) ) . filter (
1030+ ( [ name , _ ] ) => ! mcpManager . isServerDisabled ( name )
1031+ )
1032+
1033+ // Count global vs project servers
1034+ const globalServers = Array . from ( serverConfigs . entries ( ) ) . filter (
1035+ ( [ _ , config ] ) =>
1036+ config ?. __configPath__ === getGlobalMcpConfigPath ( this . #features. workspace . fs . getUserHomeDir ( ) )
1037+ ) . length
1038+ const projectServers = serverConfigs . size - globalServers
1039+
1040+ // Count tools by permission
1041+ let toolsAlwaysAllowed = 0
1042+ let toolsDenied = 0
1043+
1044+ for ( const [ serverName , _ ] of activeServers ) {
1045+ const toolsWithPermissions = mcpManager . getAllToolsWithPermissions ( serverName )
1046+ toolsWithPermissions . forEach ( item => {
1047+ if ( item . permission === McpPermissionType . alwaysAllow ) {
1048+ toolsAlwaysAllowed ++
1049+ } else if ( item . permission === McpPermissionType . deny ) {
1050+ toolsDenied ++
1051+ }
1052+ } )
1053+ }
1054+
1055+ this . #telemetryController?. emitMCPConfigEvent ( {
1056+ numActiveServers : activeServers . length ,
1057+ numGlobalServers : globalServers ,
1058+ numProjectServers : projectServers ,
1059+ numToolsAlwaysAllowed : toolsAlwaysAllowed ,
1060+ numToolsDenied : toolsDenied ,
1061+ languageServerVersion : this . #features. runtime . serverInfo . version ,
1062+ } )
1063+
1064+ // Emit server initialize events for all active servers
1065+ for ( const [ serverName , config ] of serverConfigs . entries ( ) ) {
1066+ const enabled = ! mcpManager . isServerDisabled ( serverName )
1067+ if ( enabled ) {
1068+ this . #telemetryController?. emitMCPServerInitializeEvent ( {
1069+ source : 'reload' ,
1070+ command : config . command ,
1071+ enabled,
1072+ numTools : mcpManager . getAllToolsWithPermissions ( serverName ) . length ,
1073+ scope :
1074+ config ?. __configPath__ === getGlobalMcpConfigPath ( this . #features. workspace . fs . getUserHomeDir ( ) )
1075+ ? 'global'
1076+ : 'workspace' ,
1077+ transportType : 'stdio' ,
1078+ languageServerVersion : this . #features. runtime . serverInfo . version ,
1079+ } )
1080+ }
1081+ }
1082+ }
1083+
9831084 /**
9841085 * Handled refresh MCP list events
9851086 */
9861087 async #handleRefreshMCPList( params : McpServerClickParams ) {
9871088 this . #shouldDisplayListMCPServers = true
9881089 try {
9891090 await McpManager . instance . reinitializeMcpServers ( )
1091+ this . #emitMCPConfigEvent( )
9901092 return {
9911093 id : params . id ,
9921094 }
0 commit comments