Skip to content

Commit 32ede21

Browse files
committed
chore: Inherit always preconfigured default driver options
The driver options can not be sent by the agent, so we are going to use the ones specified in the CLI arguments / ENV Vars. This is relevant because new connections should use any inherited configuration like TLS settings or FIPS by default.
1 parent 0c989c9 commit 32ede21

File tree

10 files changed

+38
-42
lines changed

10 files changed

+38
-42
lines changed

src/common/config.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import path from "path";
22
import os from "os";
33
import argv from "yargs-parser";
44
import type { CliOptions } from "@mongosh/arg-parser";
5-
import { ReadConcernLevel, ReadPreferenceMode, W } from "mongodb";
5+
import type { ConnectionInfo } from "@mongosh/arg-parser";
66

77
// From: https://github.com/mongodb-js/mongosh/blob/main/packages/cli-repl/src/arg-parser.ts
88
const OPTIONS = {
@@ -98,13 +98,6 @@ function isConnectionSpecifier(arg: string | undefined): boolean {
9898
);
9999
}
100100

101-
export interface ConnectOptions {
102-
readConcern: ReadConcernLevel;
103-
readPreference: ReadPreferenceMode;
104-
writeConcern: W;
105-
timeoutMS: number;
106-
}
107-
108101
// If we decide to support non-string config options, we'll need to extend the mechanism for parsing
109102
// env variables.
110103
export interface UserConfig extends CliOptions {
@@ -117,7 +110,6 @@ export interface UserConfig extends CliOptions {
117110
exportTimeoutMs: number;
118111
exportCleanupIntervalMs: number;
119112
connectionString?: string;
120-
connectOptions: ConnectOptions;
121113
disabledTools: Array<string>;
122114
readOnly?: boolean;
123115
indexCheck?: boolean;
@@ -135,12 +127,6 @@ const defaults: UserConfig = {
135127
exportsPath: getExportsPath(),
136128
exportTimeoutMs: 300000, // 5 minutes
137129
exportCleanupIntervalMs: 120000, // 2 minutes
138-
connectOptions: {
139-
readConcern: "local",
140-
readPreference: "secondaryPreferred",
141-
writeConcern: "majority",
142-
timeoutMS: 30_000,
143-
},
144130
disabledTools: [],
145131
telemetry: "enabled",
146132
readOnly: false,
@@ -165,6 +151,19 @@ function getLocalDataPath(): string {
165151
: path.join(os.homedir(), ".mongodb");
166152
}
167153

154+
export const defaultDriverOptions: ConnectionInfo["driverOptions"] = {
155+
readConcern: {
156+
level: "local",
157+
},
158+
readPreference: "secondaryPreferred",
159+
writeConcern: {
160+
w: "majority",
161+
},
162+
timeoutMS: 30_000,
163+
proxy: { useEnvironmentVariableProxies: true },
164+
applyProxyToOIDC: true,
165+
};
166+
168167
function getLogPath(): string {
169168
const logPath = path.join(getLocalDataPath(), "mongodb-mcp", ".app-logs");
170169
return logPath;
@@ -302,3 +301,16 @@ export function setupUserConfig({
302301

303302
return userConfig;
304303
}
304+
305+
/**
306+
readConcern: {
307+
level: settings.readConcern,
308+
},
309+
readPreference: settings.readPreference,
310+
writeConcern: {
311+
w: settings.writeConcern,
312+
},
313+
timeoutMS: settings.timeoutMS,
314+
proxy: { useEnvironmentVariableProxies: true },
315+
applyProxyToOIDC: true,
316+
**/

src/common/connectionManager.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ConnectOptions } from "./config.js";
1+
import { defaultDriverOptions } from "./config.js";
22
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
33
import EventEmitter from "events";
44
import { setAppNameParamIfMissing } from "../helpers/connectionOptions.js";
@@ -14,7 +14,7 @@ export interface AtlasClusterConnectionInfo {
1414
expiryDate: Date;
1515
}
1616

17-
export interface ConnectionSettings extends ConnectOptions {
17+
export interface ConnectionSettings {
1818
connectionString: string;
1919
atlas?: AtlasClusterConnectionInfo;
2020
}
@@ -70,6 +70,7 @@ export class ConnectionManager extends EventEmitter<ConnectionManagerEvents> {
7070

7171
constructor() {
7272
super();
73+
7374
this.state = { tag: "disconnected" };
7475
}
7576

@@ -91,16 +92,7 @@ export class ConnectionManager extends EventEmitter<ConnectionManagerEvents> {
9192
serviceProvider = await NodeDriverServiceProvider.connect(settings.connectionString, {
9293
productDocsLink: "https://github.com/mongodb-js/mongodb-mcp-server/",
9394
productName: "MongoDB MCP",
94-
readConcern: {
95-
level: settings.readConcern,
96-
},
97-
readPreference: settings.readPreference,
98-
writeConcern: {
99-
w: settings.writeConcern,
100-
},
101-
timeoutMS: settings.timeoutMS,
102-
proxy: { useEnvironmentVariableProxies: true },
103-
applyProxyToOIDC: true,
95+
...defaultDriverOptions,
10496
});
10597
} catch (error: unknown) {
10698
const errorReason = error instanceof Error ? error.message : `${error as string}`;

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,15 @@ function assertFIPSMode() {
111111
}
112112

113113
function assertHelpMode() {
114-
if (!!config.help) {
114+
if (config.help) {
115115
console.log("For usage information refer to the README.md:");
116116
console.log("https://github.com/mongodb-js/mongodb-mcp-server?tab=readme-ov-file#quick-start");
117117
process.exit(0);
118118
}
119119
}
120120

121121
function assertVersionMode() {
122-
if (!!config.version) {
122+
if (config.version) {
123123
console.log(packageInfo.version);
124124
process.exit(0);
125125
}

src/resources/common/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ReactiveResource } from "../resource.js";
2+
import { defaultDriverOptions } from "../../common/config.js";
23
import type { UserConfig } from "../../common/config.js";
34
import type { Telemetry } from "../../telemetry/telemetry.js";
45
import type { Session } from "../../lib.js";
@@ -37,7 +38,7 @@ export class ConfigResource extends ReactiveResource<UserConfig, readonly []> {
3738
connectionString: this.current.connectionString
3839
? "set; access to MongoDB tools are currently available to use"
3940
: "not set; before using any MongoDB tool, you need to configure a connection string, alternatively you can setup MongoDB Atlas access, more info at 'https://github.com/mongodb-js/mongodb-mcp-server'.",
40-
connectOptions: this.current.connectOptions,
41+
connectOptions: defaultDriverOptions,
4142
atlas:
4243
this.current.apiClientId && this.current.apiClientSecret
4344
? "set; MongoDB Atlas tools are currently available to use"

src/server.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,6 @@ export class Server {
221221
try {
222222
await this.session.connectToMongoDB({
223223
connectionString: this.userConfig.connectionString,
224-
...this.userConfig.connectOptions,
225224
});
226225
} catch (error) {
227226
console.error(

src/tools/atlas/connect/connectCluster.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export class ConnectClusterTool extends AtlasToolBase {
139139
try {
140140
lastError = undefined;
141141

142-
await this.session.connectToMongoDB({ connectionString, ...this.config.connectOptions, atlas });
142+
await this.session.connectToMongoDB({ connectionString, atlas });
143143
break;
144144
} catch (err: unknown) {
145145
const error = err instanceof Error ? err : new Error(String(err));

src/tools/mongodb/mongodbTool.ts

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

120120
protected connectToMongoDB(connectionString: string): Promise<void> {
121-
return this.session.connectToMongoDB({ connectionString, ...this.config.connectOptions });
121+
return this.session.connectToMongoDB({ connectionString });
122122
}
123123

124124
protected resolveTelemetryMetadata(

tests/integration/common/connectionManager.test.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
} from "../../../src/common/connectionManager.js";
77
import { describeWithMongoDB } from "../tools/mongodb/mongodbHelpers.js";
88
import { describe, beforeEach, expect, it, vi, afterEach } from "vitest";
9-
import { config } from "../../../src/common/config.js";
109

1110
describeWithMongoDB("Connection Manager", (integration) => {
1211
function connectionManager(): ConnectionManager {
@@ -48,7 +47,6 @@ describeWithMongoDB("Connection Manager", (integration) => {
4847

4948
await connectionManager().connect({
5049
connectionString: integration.connectionString(),
51-
...integration.mcpServer().userConfig.connectOptions,
5250
});
5351
});
5452

@@ -88,7 +86,6 @@ describeWithMongoDB("Connection Manager", (integration) => {
8886
beforeEach(async () => {
8987
await connectionManager().connect({
9088
connectionString: integration.connectionString(),
91-
...integration.mcpServer().userConfig.connectOptions,
9289
});
9390
});
9491

@@ -110,7 +107,6 @@ describeWithMongoDB("Connection Manager", (integration) => {
110107
try {
111108
await connectionManager().connect({
112109
connectionString: "mongodb://localhost:xxxxx",
113-
...integration.mcpServer().userConfig.connectOptions,
114110
});
115111
} catch (_error: unknown) {
116112
void _error;
@@ -158,7 +154,6 @@ describe("Connection Manager connection type inference", () => {
158154
it(`infers ${connectionType} from ${connectionString}`, () => {
159155
const actualConnectionType = ConnectionManager.inferConnectionTypeFromSettings({
160156
connectionString,
161-
...config.connectOptions,
162157
});
163158

164159
expect(actualConnectionType).toBe(connectionType);

tests/integration/tools/mongodb/connect/connect.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ describeWithMongoDB(
1515
beforeEach(async () => {
1616
await integration.mcpServer().session.connectToMongoDB({
1717
connectionString: integration.connectionString(),
18-
...config.connectOptions,
1918
});
2019
});
2120

tests/unit/common/session.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { beforeEach, describe, expect, it, vi } from "vitest";
22
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
33
import { Session } from "../../../src/common/session.js";
4-
import { config } from "../../../src/common/config.js";
54
import { CompositeLogger } from "../../../src/common/logger.js";
65
import { ConnectionManager } from "../../../src/common/connectionManager.js";
76
import { ExportsManager } from "../../../src/common/exportsManager.js";
@@ -52,7 +51,6 @@ describe("Session", () => {
5251
it(`should update connection string for ${testCase.name}`, async () => {
5352
await session.connectToMongoDB({
5453
connectionString: testCase.connectionString,
55-
...config.connectOptions,
5654
});
5755
expect(session.serviceProvider).toBeDefined();
5856

@@ -68,7 +66,7 @@ describe("Session", () => {
6866
}
6967

7068
it("should configure the proxy to use environment variables", async () => {
71-
await session.connectToMongoDB({ connectionString: "mongodb://localhost", ...config.connectOptions });
69+
await session.connectToMongoDB({ connectionString: "mongodb://localhost" });
7270
expect(session.serviceProvider).toBeDefined();
7371

7472
const connectMock = MockNodeDriverServiceProvider.connect;

0 commit comments

Comments
 (0)