Skip to content

Commit 8cab5a1

Browse files
committed
Remove telemetry anonymous id for now
1 parent 4da79ad commit 8cab5a1

File tree

9 files changed

+71
-128
lines changed

9 files changed

+71
-128
lines changed

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
6666
"bson": "^6.10.3",
6767
"lru-cache": "^11.1.0",
6868
"mongodb": "^6.15.0",
69-
"mongodb-build-info": "^1.7.2",
7069
"mongodb-connection-string-url": "^3.0.2",
7170
"mongodb-log-writer": "^2.4.1",
7271
"mongodb-redact": "^1.1.6",

src/helpers/connectionOptions.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,19 @@
11
import { MongoClientOptions } from "mongodb";
22
import ConnectionString from "mongodb-connection-string-url";
3-
import { isAtlas } from "mongodb-build-info";
43

54
export function setAppNameParamIfMissing({
65
connectionString,
76
defaultAppName,
8-
telemetryAnonymousId,
97
}: {
108
connectionString: string;
119
defaultAppName?: string;
12-
telemetryAnonymousId?: string;
1310
}): string {
1411
const connectionStringUrl = new ConnectionString(connectionString);
1512

1613
const searchParams = connectionStringUrl.typedSearchParams<MongoClientOptions>();
1714

1815
if (!searchParams.has("appName") && defaultAppName !== undefined) {
19-
const appName = isAtlas(connectionString)
20-
? `${defaultAppName}${telemetryAnonymousId ? `-${telemetryAnonymousId}` : ""}`
21-
: defaultAppName;
22-
23-
searchParams.set("appName", appName);
16+
searchParams.set("appName", defaultAppName);
2417
}
2518

2619
return connectionStringUrl.toString();

src/server.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,7 @@ export class Server {
187187

188188
if (this.userConfig.connectionString) {
189189
try {
190-
await this.session.connectToMongoDB(
191-
this.userConfig.connectionString,
192-
this.userConfig.connectOptions,
193-
this.telemetry
194-
);
190+
await this.session.connectToMongoDB(this.userConfig.connectionString, this.userConfig.connectOptions);
195191
} catch (error) {
196192
console.error(
197193
"Failed to connect to MongoDB instance using the connection string from the config: ",

src/session.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import EventEmitter from "events";
66
import { ConnectOptions } from "./config.js";
77
import { setAppNameParamIfMissing } from "./helpers/connectionOptions.js";
88
import { packageInfo } from "./helpers/packageInfo.js";
9-
import { Telemetry } from "./telemetry/telemetry.js";
109

1110
export interface SessionOptions {
1211
apiBaseUrl: string;
@@ -100,15 +99,10 @@ export class Session extends EventEmitter<{
10099
this.emit("close");
101100
}
102101

103-
async connectToMongoDB(
104-
connectionString: string,
105-
connectOptions: ConnectOptions,
106-
telemetry: Telemetry
107-
): Promise<void> {
102+
async connectToMongoDB(connectionString: string, connectOptions: ConnectOptions): Promise<void> {
108103
connectionString = setAppNameParamIfMissing({
109104
connectionString,
110105
defaultAppName: `${packageInfo.mcpServerName} ${packageInfo.version}`,
111-
telemetryAnonymousId: await telemetry.deviceIdPromise,
112106
});
113107
const provider = await NodeDriverServiceProvider.connect(connectionString, {
114108
productDocsLink: "https://docs.mongodb.com/todo-mcp",

src/tools/atlas/metadata/connectCluster.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class ConnectClusterTool extends AtlasToolBase {
9999

100100
for (let i = 0; i < 20; i++) {
101101
try {
102-
await this.session.connectToMongoDB(connectionString, this.config.connectOptions, this.telemetry);
102+
await this.session.connectToMongoDB(connectionString, this.config.connectOptions);
103103
lastError = undefined;
104104
break;
105105
} catch (err: unknown) {

src/tools/mongodb/mongodbTool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export abstract class MongoDBToolBase extends ToolBase {
7171
}
7272

7373
protected connectToMongoDB(connectionString: string): Promise<void> {
74-
return this.session.connectToMongoDB(connectionString, this.config.connectOptions, this.telemetry);
74+
return this.session.connectToMongoDB(connectionString, this.config.connectOptions);
7575
}
7676

7777
protected resolveTelemetryMetadata(

tests/unit/session.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { jest } from "@jest/globals";
2+
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
3+
import { Session } from "../../src/session.js";
4+
import { config } from "../../src/config.js";
5+
6+
jest.mock("@mongosh/service-provider-node-driver");
7+
const MockNodeDriverServiceProvider = NodeDriverServiceProvider as jest.MockedClass<typeof NodeDriverServiceProvider>;
8+
9+
describe("Session", () => {
10+
let session: Session;
11+
beforeEach(() => {
12+
session = new Session({
13+
apiClientId: "test-client-id",
14+
apiBaseUrl: "https://api.test.com",
15+
});
16+
17+
MockNodeDriverServiceProvider.connect = jest.fn(() =>
18+
Promise.resolve({} as unknown as NodeDriverServiceProvider)
19+
);
20+
});
21+
22+
describe("connectToMongoDB", () => {
23+
const testCases: {
24+
connectionString: string;
25+
expectAppName: boolean;
26+
name: string;
27+
}[] = [
28+
{
29+
connectionString: "mongodb://localhost:27017",
30+
expectAppName: true,
31+
name: "db without appName",
32+
},
33+
{
34+
connectionString: "mongodb://localhost:27017?appName=CustomAppName",
35+
expectAppName: false,
36+
name: "db with custom appName",
37+
},
38+
{
39+
connectionString:
40+
"mongodb+srv://test.mongodb.net/test?retryWrites=true&w=majority&appName=CustomAppName",
41+
expectAppName: false,
42+
name: "atlas db with custom appName",
43+
},
44+
];
45+
46+
for (const testCase of testCases) {
47+
it(`should update connection string for ${testCase.name}`, async () => {
48+
await session.connectToMongoDB(testCase.connectionString, config.connectOptions);
49+
expect(session.serviceProvider).toBeDefined();
50+
51+
// eslint-disable-next-line @typescript-eslint/unbound-method
52+
const connectMock = MockNodeDriverServiceProvider.connect as jest.Mock<
53+
ReturnType<typeof NodeDriverServiceProvider.connect>,
54+
Parameters<typeof NodeDriverServiceProvider.connect>
55+
>;
56+
expect(connectMock).toHaveBeenCalledOnce();
57+
const connectionString = connectMock.mock.calls[0][0];
58+
if (testCase.expectAppName) {
59+
expect(connectionString).toContain("appName=MongoDB+MCP+Server");
60+
} else {
61+
expect(connectionString).not.toContain("appName=MongoDB+MCP+Server");
62+
}
63+
});
64+
}
65+
});
66+
});

tests/unit/telemetry.test.ts

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ import { config } from "../../src/config.js";
77
import { jest } from "@jest/globals";
88
import logger, { LogId } from "../../src/logger.js";
99
import { createHmac } from "crypto";
10-
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
11-
12-
jest.mock("@mongosh/service-provider-node-driver");
13-
const MockNodeDriverServiceProvider = NodeDriverServiceProvider as jest.MockedClass<typeof NodeDriverServiceProvider>;
1410

1511
// Mock the ApiClient to avoid real API calls
1612
jest.mock("../../src/common/atlas/apiClient.js");
@@ -323,104 +319,4 @@ describe("Telemetry", () => {
323319
});
324320
});
325321
});
326-
327-
describe("connectToMongoDB", () => {
328-
beforeEach(() => {
329-
session = new Session({
330-
apiClientId: "test-client-id",
331-
apiBaseUrl: "https://api.test.com",
332-
});
333-
334-
MockNodeDriverServiceProvider.connect = jest.fn(() =>
335-
Promise.resolve({} as unknown as NodeDriverServiceProvider)
336-
);
337-
});
338-
339-
afterEach(() => {
340-
config.telemetry = "enabled";
341-
});
342-
343-
const testCases: {
344-
connectionString: string;
345-
isAtlas: boolean;
346-
expectAppName: boolean;
347-
expectTelemetryId: boolean;
348-
name: string;
349-
disableTelemetry?: boolean;
350-
}[] = [
351-
{
352-
connectionString: "mongodb://localhost:27017",
353-
isAtlas: false,
354-
expectAppName: true,
355-
expectTelemetryId: false,
356-
name: "local db",
357-
},
358-
{
359-
connectionString: "mongodb+srv://test.mongodb.net/test?retryWrites=true&w=majority",
360-
isAtlas: true,
361-
expectAppName: true,
362-
expectTelemetryId: true,
363-
name: "atlas db",
364-
},
365-
{
366-
connectionString: "mongodb://localhost:27017?appName=CustomAppName",
367-
isAtlas: false,
368-
expectAppName: false,
369-
expectTelemetryId: false,
370-
name: "local db with custom appName",
371-
},
372-
{
373-
connectionString:
374-
"mongodb+srv://test.mongodb.net/test?retryWrites=true&w=majority&appName=CustomAppName",
375-
isAtlas: true,
376-
expectAppName: false,
377-
expectTelemetryId: false,
378-
name: "atlas db with custom appName",
379-
},
380-
381-
{
382-
connectionString: "mongodb+srv://test.mongodb.net/test?retryWrites=true&w=majority",
383-
isAtlas: true,
384-
expectAppName: true,
385-
expectTelemetryId: false,
386-
name: "atlas db with telemetry disabled",
387-
disableTelemetry: true,
388-
},
389-
];
390-
391-
for (const testCase of testCases) {
392-
it(`should update connection string for ${testCase.name}`, async () => {
393-
if (testCase.disableTelemetry) {
394-
config.telemetry = "disabled";
395-
telemetry = Telemetry.create(session, config, {
396-
getRawMachineId: () => Promise.resolve(machineId),
397-
});
398-
}
399-
400-
await session.connectToMongoDB(testCase.connectionString, config.connectOptions, telemetry);
401-
expect(session.serviceProvider).toBeDefined();
402-
403-
// eslint-disable-next-line @typescript-eslint/unbound-method
404-
const connectMock = MockNodeDriverServiceProvider.connect as jest.Mock;
405-
expect(connectMock).toHaveBeenCalledOnce();
406-
const connectionString = connectMock.mock.calls[0][0];
407-
if (testCase.expectAppName) {
408-
expect(connectionString).toContain("appName=MongoDB+MCP+Server");
409-
} else {
410-
expect(connectionString).not.toContain("appName=MongoDB+MCP+Server");
411-
}
412-
413-
if (testCase.disableTelemetry) {
414-
expect(connectionString).not.toMatch(/appName=[^-]*-[^&]*/);
415-
} else {
416-
const telemetryId = await telemetry.deviceIdPromise;
417-
if (testCase.isAtlas && testCase.expectTelemetryId) {
418-
expect(connectionString).toContain(telemetryId);
419-
} else {
420-
expect(connectionString).not.toContain(telemetryId);
421-
}
422-
}
423-
});
424-
}
425-
});
426322
});

0 commit comments

Comments
 (0)