From 84989079390587811a0919b46b5fdf78f3284db4 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Thu, 13 Nov 2025 11:34:38 +0100 Subject: [PATCH 1/2] chore: move config related code to common folder --- scripts/generateArguments.ts | 2 +- src/common/config.ts | 4 ++-- src/common/{ => config}/argsParserOptions.ts | 0 src/common/{ => config}/configUtils.ts | 0 tests/unit/common/config.test.ts | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename src/common/{ => config}/argsParserOptions.ts (100%) rename src/common/{ => config}/configUtils.ts (100%) diff --git a/scripts/generateArguments.ts b/scripts/generateArguments.ts index ee3695c4..69d10bc4 100644 --- a/scripts/generateArguments.ts +++ b/scripts/generateArguments.ts @@ -14,7 +14,7 @@ import { fileURLToPath } from "url"; import { UserConfigSchema, configRegistry } from "../src/common/config.js"; import assert from "assert"; import { execSync } from "child_process"; -import { OPTIONS } from "../src/common/argsParserOptions.js"; +import { OPTIONS } from "../src/common/config/argsParserOptions.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); diff --git a/src/common/config.ts b/src/common/config.ts index 6e404b86..ff5e2fec 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -11,8 +11,8 @@ import { getLogPath, isConnectionSpecifier, validateConfigKey, -} from "./configUtils.js"; -import { OPTIONS } from "./argsParserOptions.js"; +} from "./config/configUtils.js"; +import { OPTIONS } from "./config/argsParserOptions.js"; import { similarityValues, previewFeatureValues } from "./schemas.js"; export const configRegistry = z4.registry(); diff --git a/src/common/argsParserOptions.ts b/src/common/config/argsParserOptions.ts similarity index 100% rename from src/common/argsParserOptions.ts rename to src/common/config/argsParserOptions.ts diff --git a/src/common/configUtils.ts b/src/common/config/configUtils.ts similarity index 100% rename from src/common/configUtils.ts rename to src/common/config/configUtils.ts diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index ebd4d0bb..827a5d6b 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -7,7 +7,7 @@ import { UserConfigSchema, warnIfVectorSearchNotEnabledCorrectly, } from "../../../src/common/config.js"; -import { getLogPath, getExportsPath } from "../../../src/common/configUtils.js"; +import { getLogPath, getExportsPath } from "../../../src/common/config/configUtils.js"; import type { CliOptions } from "@mongosh/arg-parser"; import { Keychain } from "../../../src/common/keychain.js"; import type { Secret } from "../../../src/common/keychain.js"; From f2dce249ff6c1dcd3c4bffd10af4fbf17e3ab284 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Thu, 13 Nov 2025 12:12:41 +0100 Subject: [PATCH 2/2] chore: untangle driverOptions from config --- src/common/config.ts | 30 +------------------ src/common/config/driverOptions.ts | 27 +++++++++++++++++ src/common/connectionManager.ts | 8 ++--- src/resources/common/config.ts | 4 +-- .../common/connectionManager.oidc.test.ts | 8 ++--- tests/integration/helpers.ts | 13 ++------ .../tools/mongodb/mongodbHelpers.ts | 3 +- .../tools/mongodb/mongodbTool.test.ts | 3 +- 8 files changed, 42 insertions(+), 54 deletions(-) create mode 100644 src/common/config/driverOptions.ts diff --git a/src/common/config.ts b/src/common/config.ts index ff5e2fec..35b4616c 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -1,5 +1,5 @@ import argv from "yargs-parser"; -import type { CliOptions, ConnectionInfo } from "@mongosh/arg-parser"; +import type { CliOptions } from "@mongosh/arg-parser"; import { generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; import { Keychain } from "./keychain.js"; import type { Secret } from "./keychain.js"; @@ -183,20 +183,6 @@ export const config = setupUserConfig({ env: process.env, }); -export type DriverOptions = ConnectionInfo["driverOptions"]; -export const defaultDriverOptions: DriverOptions = { - readConcern: { - level: "local", - }, - readPreference: "secondaryPreferred", - writeConcern: { - w: "majority", - }, - timeoutMS: 30_000, - proxy: { useEnvironmentVariableProxies: true }, - applyProxyToOIDC: true, -}; - // Gets the config supplied by the user as environment variables. The variable names // are prefixed with `MDB_MCP_` and the keys match the UserConfig keys, but are converted // to SNAKE_UPPER_CASE. @@ -414,17 +400,3 @@ export function setupUserConfig({ cli, env }: { cli: string[]; env: Record; -}): DriverOptions { - const { driverOptions } = generateConnectionInfoFromCliArgs(config); - return { - ...defaults, - ...driverOptions, - }; -} diff --git a/src/common/config/driverOptions.ts b/src/common/config/driverOptions.ts new file mode 100644 index 00000000..1a9a0a6d --- /dev/null +++ b/src/common/config/driverOptions.ts @@ -0,0 +1,27 @@ +import { generateConnectionInfoFromCliArgs, type ConnectionInfo } from "@mongosh/arg-parser"; +import type { UserConfig } from "../config.js"; + +export type DriverOptions = ConnectionInfo["driverOptions"]; +export const defaultDriverOptions: DriverOptions = { + readConcern: { + level: "local", + }, + readPreference: "secondaryPreferred", + writeConcern: { + w: "majority", + }, + timeoutMS: 30_000, + proxy: { useEnvironmentVariableProxies: true }, + applyProxyToOIDC: true, +}; + +export function createDriverOptions( + config: UserConfig, + defaults: Partial = defaultDriverOptions +): DriverOptions { + const { driverOptions } = generateConnectionInfoFromCliArgs(config); + return { + ...defaults, + ...driverOptions, + }; +} diff --git a/src/common/connectionManager.ts b/src/common/connectionManager.ts index bb8002d3..1f0b94e0 100644 --- a/src/common/connectionManager.ts +++ b/src/common/connectionManager.ts @@ -4,7 +4,8 @@ import { ConnectionString } from "mongodb-connection-string-url"; import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver"; import { type ConnectionInfo, generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; import type { DeviceId } from "../helpers/deviceId.js"; -import { defaultDriverOptions, setupDriverConfig, type DriverOptions, type UserConfig } from "./config.js"; +import { createDriverOptions, type DriverOptions } from "./config/driverOptions.js"; +import { type UserConfig } from "./config.js"; import { MongoDBError, ErrorCodes } from "./errors.js"; import { type LoggerBase, LogId } from "./logger.js"; import { packageInfo } from "./packageInfo.js"; @@ -394,10 +395,7 @@ export type ConnectionManagerFactoryFn = (createParams: { }) => Promise; export const createMCPConnectionManager: ConnectionManagerFactoryFn = ({ logger, deviceId, userConfig }) => { - const driverOptions = setupDriverConfig({ - config: userConfig, - defaults: defaultDriverOptions, - }); + const driverOptions = createDriverOptions(userConfig); return Promise.resolve(new MCPConnectionManager(userConfig, driverOptions, logger, deviceId)); }; diff --git a/src/resources/common/config.ts b/src/resources/common/config.ts index d67b0400..7949bd90 100644 --- a/src/resources/common/config.ts +++ b/src/resources/common/config.ts @@ -1,5 +1,5 @@ import { ReactiveResource } from "../resource.js"; -import { defaultDriverOptions } from "../../common/config.js"; +import { createDriverOptions } from "../../common/config/driverOptions.js"; import type { UserConfig } from "../../common/config.js"; import type { Telemetry } from "../../telemetry/telemetry.js"; import type { Session } from "../../lib.js"; @@ -38,7 +38,7 @@ export class ConfigResource extends ReactiveResource { connectionString: this.current.connectionString ? "set; access to MongoDB tools are currently available to use" : "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'.", - connectOptions: defaultDriverOptions, + connectOptions: createDriverOptions(this.config), atlas: this.current.apiClientId && this.current.apiClientSecret ? "set; MongoDB Atlas tools are currently available to use" diff --git a/tests/integration/common/connectionManager.oidc.test.ts b/tests/integration/common/connectionManager.oidc.test.ts index 595239ce..401f91fd 100644 --- a/tests/integration/common/connectionManager.oidc.test.ts +++ b/tests/integration/common/connectionManager.oidc.test.ts @@ -7,7 +7,7 @@ import { describeWithMongoDB, isCommunityServer, getServerVersion } from "../too import { defaultTestConfig, responseAsText, timeout, waitUntil } from "../helpers.js"; import type { ConnectionStateConnected, ConnectionStateConnecting } from "../../../src/common/connectionManager.js"; import type { UserConfig } from "../../../src/common/config.js"; -import { setupDriverConfig } from "../../../src/common/config.js"; +import { createDriverOptions } from "../../../src/common/config/driverOptions.js"; import path from "path"; import type { OIDCMockProviderConfig } from "@mongodb-js/oidc-mock-provider"; import { OIDCMockProvider } from "@mongodb-js/oidc-mock-provider"; @@ -142,11 +142,7 @@ describe.skipIf(process.platform !== "linux")("ConnectionManager OIDC Tests", as }, { getUserConfig: () => oidcConfig, - getDriverOptions: () => - setupDriverConfig({ - config: oidcConfig, - defaults: {}, - }), + getDriverOptions: () => createDriverOptions(oidcConfig), downloadOptions: { runner: true, downloadOptions: { enterprise: true, version: mongodbVersion }, diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index 78560f52..182ac457 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -6,13 +6,9 @@ import { Telemetry } from "../../src/telemetry/telemetry.js"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { InMemoryTransport } from "./inMemoryTransport.js"; -import type { UserConfig, DriverOptions } from "../../src/common/config.js"; +import { type UserConfig, config } from "../../src/common/config.js"; +import { type DriverOptions, createDriverOptions } from "../../src/common/config/driverOptions.js"; import { McpError, ResourceUpdatedNotificationSchema } from "@modelcontextprotocol/sdk/types.js"; -import { - config, - setupDriverConfig, - defaultDriverOptions as defaultDriverOptionsFromConfig, -} from "../../src/common/config.js"; import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import type { ConnectionManager, ConnectionState } from "../../src/common/connectionManager.js"; import { MCPConnectionManager } from "../../src/common/connectionManager.js"; @@ -24,10 +20,7 @@ import type { MockClientCapabilities, createMockElicitInput } from "../utils/eli import { VectorSearchEmbeddingsManager } from "../../src/common/search/vectorSearchEmbeddingsManager.js"; import { defaultCreateAtlasLocalClient } from "../../src/common/atlasLocal.js"; -export const driverOptions = setupDriverConfig({ - config, - defaults: defaultDriverOptionsFromConfig, -}); +export const driverOptions = createDriverOptions(config); export const defaultDriverOptions: DriverOptions = { ...driverOptions }; diff --git a/tests/integration/tools/mongodb/mongodbHelpers.ts b/tests/integration/tools/mongodb/mongodbHelpers.ts index d53c97df..be654100 100644 --- a/tests/integration/tools/mongodb/mongodbHelpers.ts +++ b/tests/integration/tools/mongodb/mongodbHelpers.ts @@ -11,7 +11,8 @@ import { defaultDriverOptions, getDataFromUntrustedContent, } from "../../helpers.js"; -import type { UserConfig, DriverOptions } from "../../../../src/common/config.js"; +import type { UserConfig } from "../../../../src/common/config.js"; +import type { DriverOptions } from "../../../../src/common/config/driverOptions.js"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { EJSON } from "bson"; import { MongoDBClusterProcess } from "./mongodbClusterProcess.js"; diff --git a/tests/integration/tools/mongodb/mongodbTool.test.ts b/tests/integration/tools/mongodb/mongodbTool.test.ts index de538292..80c8939d 100644 --- a/tests/integration/tools/mongodb/mongodbTool.test.ts +++ b/tests/integration/tools/mongodb/mongodbTool.test.ts @@ -4,7 +4,8 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { MongoDBToolBase } from "../../../../src/tools/mongodb/mongodbTool.js"; import { type ToolBase, type ToolConstructorParams, type OperationType } from "../../../../src/tools/tool.js"; -import { defaultDriverOptions, type UserConfig } from "../../../../src/common/config.js"; +import { type UserConfig } from "../../../../src/common/config.js"; +import { defaultDriverOptions } from "../../../../src/common/config/driverOptions.js"; import { MCPConnectionManager } from "../../../../src/common/connectionManager.js"; import { Session } from "../../../../src/common/session.js"; import { CompositeLogger } from "../../../../src/common/logger.js";