Skip to content

Commit a2fd0cf

Browse files
committed
Update connection string app name if not present
1 parent 59e2511 commit a2fd0cf

16 files changed

+222
-10
lines changed

package-lock.json

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

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
"bson": "^6.10.3",
6767
"lru-cache": "^11.1.0",
6868
"mongodb": "^6.15.0",
69+
"mongodb-build-info": "^1.7.2",
70+
"mongodb-connection-string-url": "^3.0.2",
6971
"mongodb-log-writer": "^2.4.1",
7072
"mongodb-redact": "^1.1.6",
7173
"mongodb-schema": "^12.6.2",

src/common/atlas/apiClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { AccessToken, ClientCredentials } from "simple-oauth2";
44
import { ApiClientError } from "./apiClientError.js";
55
import { paths, operations } from "./openapi.js";
66
import { CommonProperties, TelemetryEvent } from "../../telemetry/types.js";
7-
import { packageInfo } from "../../packageInfo.js";
7+
import { packageInfo } from "../../helpers/packageInfo.js";
88

99
const ATLAS_API_VERSION = "2025-03-12";
1010

src/helpers/connectionOptions.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { MongoClientOptions } from "mongodb";
2+
import ConnectionString from "mongodb-connection-string-url";
3+
import { isAtlas } from "mongodb-build-info";
4+
5+
export function setAppNameParamIfMissing({
6+
connectionString,
7+
defaultAppName,
8+
telemetryAnonymousId,
9+
}: {
10+
connectionString: string;
11+
defaultAppName?: string;
12+
telemetryAnonymousId?: string;
13+
}): string {
14+
const connectionStringUrl = new ConnectionString(connectionString);
15+
16+
const searchParams = connectionStringUrl.typedSearchParams<MongoClientOptions>();
17+
18+
if (!searchParams.has("appName") && defaultAppName !== undefined) {
19+
const appName = isAtlas(connectionString)
20+
? `${defaultAppName}${telemetryAnonymousId ? `-${telemetryAnonymousId}` : ""}`
21+
: defaultAppName;
22+
23+
searchParams.set("appName", appName);
24+
}
25+
26+
return connectionStringUrl.toString();
27+
}
File renamed without changes.

src/packageInfo.ts renamed to src/helpers/packageInfo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import packageJson from "../package.json" with { type: "json" };
1+
import packageJson from "../../package.json" with { type: "json" };
22

33
export const packageInfo = {
44
version: packageJson.version,

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
66
import { config } from "./config.js";
77
import { Session } from "./session.js";
88
import { Server } from "./server.js";
9-
import { packageInfo } from "./packageInfo.js";
9+
import { packageInfo } from "./helpers/packageInfo.js";
1010
import { Telemetry } from "./telemetry/telemetry.js";
1111

1212
try {

src/server.ts

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

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

src/session.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { Implementation } from "@modelcontextprotocol/sdk/types.js";
44
import logger, { LogId } from "./logger.js";
55
import EventEmitter from "events";
66
import { ConnectOptions } from "./config.js";
7+
import { setAppNameParamIfMissing } from "./helpers/connectionOptions.js";
8+
import { packageInfo } from "./helpers/packageInfo.js";
9+
import { Telemetry } from "./telemetry/telemetry.js";
710

811
export interface SessionOptions {
912
apiBaseUrl: string;
@@ -97,7 +100,16 @@ export class Session extends EventEmitter<{
97100
this.emit("close");
98101
}
99102

100-
async connectToMongoDB(connectionString: string, connectOptions: ConnectOptions): Promise<void> {
103+
async connectToMongoDB(
104+
connectionString: string,
105+
connectOptions: ConnectOptions,
106+
telemetry: Telemetry
107+
): Promise<void> {
108+
connectionString = setAppNameParamIfMissing({
109+
connectionString,
110+
defaultAppName: `${packageInfo.mcpServerName} ${packageInfo.version}`,
111+
telemetryAnonymousId: await telemetry.deviceIdPromise,
112+
});
101113
const provider = await NodeDriverServiceProvider.connect(connectionString, {
102114
productDocsLink: "https://docs.mongodb.com/todo-mcp",
103115
productName: "MongoDB MCP",

src/telemetry/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { packageInfo } from "../packageInfo.js";
1+
import { packageInfo } from "../helpers/packageInfo.js";
22
import { type CommonStaticProperties } from "./types.js";
33

44
/**

0 commit comments

Comments
 (0)