diff --git a/src/mcp/mcpController.ts b/src/mcp/mcpController.ts index 64e96b57a..eac71861e 100644 --- a/src/mcp/mcpController.ts +++ b/src/mcp/mcpController.ts @@ -22,6 +22,7 @@ import { createMCPConnectionErrorHandler } from './mcpConnectionErrorHandler'; import { getMCPConfigFromVSCodeSettings } from './mcpConfig'; import { DEFAULT_TELEMETRY_APP_NAME } from '../connectionController'; import formatError from '../utils/formatError'; +import { TelemetryService } from '../telemetry'; export type MCPServerStartupConfig = | 'prompt' @@ -52,12 +53,14 @@ type MCPControllerConfig = { context: vscode.ExtensionContext; connectionController: ConnectionController; getTelemetryAnonymousId: () => string; + telemetryService: TelemetryService; }; export class MCPController { private context: vscode.ExtensionContext; private connectionController: ConnectionController; private getTelemetryAnonymousId: () => string; + private telemetryService: TelemetryService; private mcpConnectionManagers: MCPConnectionManager[] = []; private didChangeEmitter = new vscode.EventEmitter(); @@ -67,10 +70,12 @@ export class MCPController { context, connectionController, getTelemetryAnonymousId, + telemetryService, }: MCPControllerConfig) { this.context = context; this.connectionController = connectionController; this.getTelemetryAnonymousId = getTelemetryAnonymousId; + this.telemetryService = telemetryService; } public async activate(): Promise { @@ -253,6 +258,9 @@ export class MCPController { loggers: Array.from( new Set(['mcp', ...(configFromSettings.loggers ?? [])]), ), + telemetry: this.telemetryService.isTelemetryFeatureEnabled() + ? 'enabled' + : 'disabled', }; return UserConfigSchema.parse(vsCodeConfig); diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index b38720cdf..2aea12435 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -275,6 +275,7 @@ export default class MDBExtensionController implements vscode.Disposable { connectionController: this._connectionController, getTelemetryAnonymousId: (): string => this._connectionStorage.getUserAnonymousId(), + telemetryService: this._telemetryService, }); } diff --git a/src/telemetry/telemetryService.ts b/src/telemetry/telemetryService.ts index 1b29e61a4..83c04ef45 100644 --- a/src/telemetry/telemetryService.ts +++ b/src/telemetry/telemetryService.ts @@ -132,7 +132,7 @@ export class TelemetryService { // Checks user settings and extension running mode // to determine whether or not we should track telemetry. - _isTelemetryFeatureEnabled(): boolean { + isTelemetryFeatureEnabled(): boolean { // If tests run the extension we do not track telemetry. if (this._shouldTrackTelemetry !== true) { return false; @@ -152,7 +152,7 @@ export class TelemetryService { } _segmentAnalyticsTrack(segmentProperties: SegmentProperties): void { - if (!this._isTelemetryFeatureEnabled()) { + if (!this.isTelemetryFeatureEnabled()) { return; } diff --git a/src/test/suite/mcp/mcpController.test.ts b/src/test/suite/mcp/mcpController.test.ts index bf4efc839..81146431c 100644 --- a/src/test/suite/mcp/mcpController.test.ts +++ b/src/test/suite/mcp/mcpController.test.ts @@ -55,6 +55,7 @@ suite('MCPController test suite', function () { this.timeout(10_000); let connectionController: ConnectionController; let mcpController: MCPController; + let testTelemetryService: TelemetryService; let mcpAutoStartValue: string | null | undefined; let getConfigurationStub: SinonStub; @@ -72,7 +73,7 @@ suite('MCPController test suite', function () { beforeEach(() => { const extensionContext = new ExtensionContextStub(); const testStorageController = new StorageController(extensionContext); - const testTelemetryService = new TelemetryService( + testTelemetryService = new TelemetryService( testStorageController, extensionContext, ); @@ -86,6 +87,7 @@ suite('MCPController test suite', function () { context: extensionContext, connectionController: connectionController, getTelemetryAnonymousId: (): string => '1FOO', + telemetryService: testTelemetryService, }); // GetConfiguration Stubs @@ -839,6 +841,28 @@ suite('MCPController test suite', function () { }); }); + suite('MCP server telemetry configuration', function () { + test('passes telemetry "enabled" to MCP server config when telemetry is enabled', function () { + sandbox + .stub(testTelemetryService, 'isTelemetryFeatureEnabled') + .returns(true); + const config = (mcpController as any).getMCPServerConfig({ + authorization: 'Bearer test', + }); + expect(config.telemetry).to.equal('enabled'); + }); + + test('passes telemetry "disabled" to MCP server config when telemetry is disabled', function () { + sandbox + .stub(testTelemetryService, 'isTelemetryFeatureEnabled') + .returns(false); + const config = (mcpController as any).getMCPServerConfig({ + authorization: 'Bearer test', + }); + expect(config.telemetry).to.equal('disabled'); + }); + }); + suite('#openServerConfig', function () { suite('when the server is not running', function () { test('should notify that server is not running', async function () { diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 77c026cf4..22584a10f 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -170,6 +170,26 @@ suite('MDBExtensionController Test Suite', function () { }); }); + suite('MCP server telemetry', function () { + test('MCPController uses the same telemetry service as the extension controller', function () { + const extensionController = mdbTestExtension.testExtensionController; + expect(extensionController._mcpController['telemetryService']).to.equal( + extensionController._telemetryService, + ); + }); + + test('MCP server is configured with telemetry disabled when extension telemetry is disabled', function () { + const extensionController = mdbTestExtension.testExtensionController; + // In test mode shouldTrackTelemetry is false, so telemetry is disabled + expect(extensionController._telemetryService.isTelemetryFeatureEnabled()) + .to.be.false; + const mcpServerConfig = ( + extensionController._mcpController as any + ).getMCPServerConfig({ authorization: 'Bearer test' }); + expect(mcpServerConfig.telemetry).to.equal('disabled'); + }); + }); + suite('when not connected', function () { let showErrorMessageStub: SinonSpy; diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index a37227549..272a9eab4 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -109,7 +109,7 @@ suite('Telemetry Controller Test Suite', function () { sandbox.stub(vscode.window, 'showInformationMessage'); sandbox.replace( testTelemetryService, - '_isTelemetryFeatureEnabled', + 'isTelemetryFeatureEnabled', sandbox.fake.returns(true), ); });