diff --git a/scripts/generateArguments.ts b/scripts/generateArguments.ts index ee3695c4f..69d10bc4a 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 6e404b863..35b4616c1 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"; @@ -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(); @@ -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/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/src/common/config/driverOptions.ts b/src/common/config/driverOptions.ts new file mode 100644 index 000000000..1a9a0a6d0 --- /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 bb8002d35..1f0b94e0d 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 d67b04004..7949bd906 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 595239ce6..401f91fda 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 78560f52b..182ac457d 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 d53c97df5..be654100b 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 de5382929..80c8939d7 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"; diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index ebd4d0bb6..827a5d6b1 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";