Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/generateArguments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
34 changes: 3 additions & 31 deletions src/common/config.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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<ConfigFieldMeta>();
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -414,17 +400,3 @@ export function setupUserConfig({ cli, env }: { cli: string[]; env: Record<strin
registerKnownSecretsInRootKeychain(userConfig);
return userConfig;
}

export function setupDriverConfig({
config,
defaults,
}: {
config: UserConfig;
defaults: Partial<DriverOptions>;
}): DriverOptions {
const { driverOptions } = generateConnectionInfoFromCliArgs(config);
return {
...defaults,
...driverOptions,
};
}
File renamed without changes.
27 changes: 27 additions & 0 deletions src/common/config/driverOptions.ts
Original file line number Diff line number Diff line change
@@ -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<DriverOptions> = defaultDriverOptions
): DriverOptions {
const { driverOptions } = generateConnectionInfoFromCliArgs(config);
return {
...defaults,
...driverOptions,
};
}
8 changes: 3 additions & 5 deletions src/common/connectionManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -394,10 +395,7 @@ export type ConnectionManagerFactoryFn = (createParams: {
}) => Promise<ConnectionManager>;

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));
};
4 changes: 2 additions & 2 deletions src/resources/common/config.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -38,7 +38,7 @@ export class ConfigResource extends ReactiveResource<UserConfig, readonly []> {
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"
Expand Down
8 changes: 2 additions & 6 deletions tests/integration/common/connectionManager.oidc.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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 },
Expand Down
13 changes: 3 additions & 10 deletions tests/integration/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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 };

Expand Down
3 changes: 2 additions & 1 deletion tests/integration/tools/mongodb/mongodbHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
3 changes: 2 additions & 1 deletion tests/integration/tools/mongodb/mongodbTool.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/common/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Loading