Skip to content

Commit 139c3ee

Browse files
committed
Merge remote-tracking branch 'origin/main' into telemetry
2 parents 807b2ca + fa2fdd6 commit 139c3ee

File tree

16 files changed

+132
-115
lines changed

16 files changed

+132
-115
lines changed

src/common/atlas/apiClient.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import config from "../../config.js";
21
import createClient, { Client, Middleware } from "openapi-fetch";
32
import type { FetchOptions } from "openapi-fetch";
43
import { AccessToken, ClientCredentials } from "simple-oauth2";
@@ -7,6 +6,7 @@ import { paths, operations } from "./openapi.js";
76
import { BaseEvent } from "../../telemetry/types.js";
87
import { mongoLogId } from "mongodb-log-writer";
98
import logger from "../../logger.js";
9+
import { packageInfo } from "../../packageInfo.js";
1010

1111
const ATLAS_API_VERSION = "2025-03-12";
1212

@@ -71,7 +71,7 @@ export class ApiClient {
7171
baseUrl: options?.baseUrl || "https://cloud.mongodb.com/",
7272
userAgent:
7373
options?.userAgent ||
74-
`${config.mcpServerName}/${config.version} (${process.platform}; ${process.arch}; ${process.env.HOSTNAME || "unknown"})`,
74+
`AtlasMCP/${packageInfo.version} (${process.platform}; ${process.arch}; ${process.env.HOSTNAME || "unknown"})`,
7575
};
7676

7777
this.client = createClient<paths>({

src/config.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@ import path from "path";
22
import os from "os";
33
import argv from "yargs-parser";
44

5-
import packageJson from "../package.json" with { type: "json" };
65
import { ReadConcernLevel, ReadPreferenceMode, W } from "mongodb";
76

8-
export const SERVER_NAME = "MdbMcpServer";
9-
export const SERVER_VERSION = packageJson.version;
10-
117
// If we decide to support non-string config options, we'll need to extend the mechanism for parsing
128
// env variables.
13-
interface UserConfig {
9+
export interface UserConfig {
1410
apiBaseUrl?: string;
1511
apiClientId?: string;
1612
apiClientSecret?: string;
@@ -37,20 +33,12 @@ const defaults: UserConfig = {
3733
disabledTools: [],
3834
};
3935

40-
const mergedUserConfig = {
36+
export const config = {
4137
...defaults,
4238
...getEnvConfig(),
4339
...getCliConfig(),
4440
};
4541

46-
const config = {
47-
...mergedUserConfig,
48-
version: SERVER_VERSION,
49-
mcpServerName: SERVER_NAME,
50-
};
51-
52-
export default config;
53-
5442
function getLogPath(): string {
5543
const localDataPath =
5644
process.platform === "win32"

src/index.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,25 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
44
import logger from "./logger.js";
55
import { mongoLogId } from "mongodb-log-writer";
66
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7-
import config from "./config.js";
7+
import { config } from "./config.js";
88
import { Session } from "./session.js";
99
import { Server } from "./server.js";
10+
import { packageInfo } from "./packageInfo.js";
1011

1112
try {
12-
const session = new Session();
13+
const session = new Session({
14+
apiBaseUrl: config.apiBaseUrl,
15+
apiClientId: config.apiClientId,
16+
apiClientSecret: config.apiClientSecret,
17+
});
1318
const mcpServer = new McpServer({
14-
name: "MongoDB Atlas",
15-
version: config.version,
19+
name: packageInfo.mcpServerName,
20+
version: packageInfo.version,
1621
});
17-
1822
const server = new Server({
1923
mcpServer,
2024
session,
25+
userConfig: config,
2126
});
2227

2328
const transport = new StdioServerTransport();

src/logger.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import fs from "fs/promises";
22
import { MongoLogId, MongoLogManager, MongoLogWriter } from "mongodb-log-writer";
3-
import config from "./config.js";
43
import redact from "mongodb-redact";
54
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
65
import { LoggingMessageNotification } from "@modelcontextprotocol/sdk/types.js";
@@ -98,11 +97,11 @@ class ProxyingLogger extends LoggerBase {
9897
const logger = new ProxyingLogger();
9998
export default logger;
10099

101-
export async function initializeLogger(server: McpServer): Promise<void> {
102-
await fs.mkdir(config.logPath, { recursive: true });
100+
export async function initializeLogger(server: McpServer, logPath: string): Promise<void> {
101+
await fs.mkdir(logPath, { recursive: true });
103102

104103
const manager = new MongoLogManager({
105-
directory: config.logPath,
104+
directory: logPath,
106105
retentionDays: 30,
107106
onwarn: console.warn,
108107
onerror: console.error,

src/packageInfo.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import packageJson from "../package.json" with { type: "json" };
2+
3+
export const packageInfo = {
4+
version: packageJson.version,
5+
mcpServerName: "MongoDB MCP Server",
6+
};

src/server.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,35 @@ import { AtlasTools } from "./tools/atlas/tools.js";
55
import { MongoDbTools } from "./tools/mongodb/tools.js";
66
import logger, { initializeLogger } from "./logger.js";
77
import { mongoLogId } from "mongodb-log-writer";
8-
import config from "./config.js";
98
import { ObjectId } from "mongodb";
109
import { Telemetry } from "./telemetry/telemetry.js";
10+
import { UserConfig } from "./config.js";
11+
12+
export interface ServerOptions {
13+
session: Session;
14+
userConfig: UserConfig;
15+
mcpServer: McpServer;
16+
}
1117

1218
export class Server {
1319
public readonly session: Session;
1420
private readonly mcpServer: McpServer;
1521
private readonly telemetry: Telemetry;
22+
private readonly userConfig: UserConfig;
1623

17-
constructor({ mcpServer, session }: { mcpServer: McpServer; session: Session }) {
18-
this.mcpServer = mcpServer;
24+
constructor({ session, mcpServer, userConfig }: ServerOptions) {
1925
this.session = session;
2026
this.telemetry = new Telemetry(session);
27+
this.mcpServer = mcpServer;
28+
this.userConfig = userConfig;
2129
}
2230

2331
async connect(transport: Transport) {
2432
this.mcpServer.server.registerCapabilities({ logging: {} });
2533
this.registerTools();
2634
this.registerResources();
2735

28-
await initializeLogger(this.mcpServer);
36+
await initializeLogger(this.mcpServer, this.userConfig.logPath);
2937

3038
await this.mcpServer.connect(transport);
3139

@@ -48,12 +56,12 @@ export class Server {
4856

4957
private registerTools() {
5058
for (const tool of [...AtlasTools, ...MongoDbTools]) {
51-
new tool(this.session, this.telemetry).register(this.mcpServer);
59+
new tool(this.session, this.userConfig, this.telemetry).register(this.mcpServer);
5260
}
5361
}
5462

5563
private registerResources() {
56-
if (config.connectionString) {
64+
if (this.userConfig.connectionString) {
5765
this.mcpServer.resource(
5866
"connection-string",
5967
"config://connection-string",
@@ -64,7 +72,7 @@ export class Server {
6472
return {
6573
contents: [
6674
{
67-
text: `Preconfigured connection string: ${config.connectionString}`,
75+
text: `Preconfigured connection string: ${this.userConfig.connectionString}`,
6876
uri: uri.href,
6977
},
7078
],

src/session.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
22
import { ApiClient, ApiClientCredentials } from "./common/atlas/apiClient.js";
33
import { Implementation } from "@modelcontextprotocol/sdk/types.js";
4-
import config from "./config.js";
4+
5+
export interface SessionOptions {
6+
apiBaseUrl?: string;
7+
apiClientId?: string;
8+
apiClientSecret?: string;
9+
}
510

611
export class Session {
712
sessionId?: string;
@@ -12,17 +17,17 @@ export class Session {
1217
version: string;
1318
};
1419

15-
constructor() {
20+
constructor({ apiBaseUrl, apiClientId, apiClientSecret }: SessionOptions = {}) {
1621
const credentials: ApiClientCredentials | undefined =
17-
config.apiClientId && config.apiClientSecret
22+
apiClientId && apiClientSecret
1823
? {
19-
clientId: config.apiClientId,
20-
clientSecret: config.apiClientSecret,
24+
clientId: apiClientId,
25+
clientSecret: apiClientSecret,
2126
}
2227
: undefined;
2328

2429
this.apiClient = new ApiClient({
25-
baseUrl: config.apiBaseUrl,
30+
baseUrl: apiBaseUrl,
2631
credentials,
2732
});
2833
}

src/telemetry/constants.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
import pkg from "../../package.json" with { type: "json" };
2-
import config from "../config.js";
31
import { getMachineIdSync } from "native-machine-id";
2+
import { packageInfo } from "../packageInfo.js";
43

54
/**
65
* Machine-specific metadata formatted for telemetry
76
*/
87
export const MACHINE_METADATA = {
98
device_id: getMachineIdSync(),
10-
mcp_server_version: pkg.version,
11-
mcp_server_name: config.mcpServerName,
9+
mcp_server_version: packageInfo.version,
10+
mcp_server_name: packageInfo.mcpServerName,
1211
platform: process.platform,
1312
arch: process.arch,
1413
os_type: process.platform,

src/telemetry/telemetry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Session } from "../session.js";
22
import { BaseEvent } from "./types.js";
3-
import config from "../config.js";
3+
import { config } from "../config.js";
44
import logger from "../logger.js";
55
import { mongoLogId } from "mongodb-log-writer";
66
import { ApiClient } from "../common/atlas/apiClient.js";

src/tools/atlas/atlasTool.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
import { ToolBase, ToolCategory } from "../tool.js";
22
import { Session } from "../../session.js";
3-
import config from "../../config.js";
43
import { Telemetry } from "../../telemetry/telemetry.js";
54

65
export abstract class AtlasToolBase extends ToolBase {
7-
constructor(
8-
protected readonly session: Session,
9-
telemetry: Telemetry
10-
) {
11-
super(session, telemetry);
12-
}
13-
146
protected category: ToolCategory = "atlas";
15-
7+
168
protected verifyAllowed(): boolean {
17-
if (!config.apiClientId || !config.apiClientSecret) {
9+
if (!this.config.apiClientId || !this.config.apiClientSecret) {
1810
return false;
1911
}
2012
return super.verifyAllowed();

0 commit comments

Comments
 (0)