Skip to content

Commit 1b8ea02

Browse files
committed
WIP
1 parent 9cf0447 commit 1b8ea02

File tree

11 files changed

+38
-206
lines changed

11 files changed

+38
-206
lines changed

package-lock.json

Lines changed: 0 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
"dependencies": {
5959
"@modelcontextprotocol/sdk": "^1.8.0",
6060
"@mongodb-js/devtools-connect": "^3.7.2",
61-
"@mongodb-js/get-os-info": "^0.4.1",
6261
"@mongosh/service-provider-node-driver": "^3.6.0",
6362
"bson": "^6.10.3",
6463
"mongodb": "^6.15.0",

src/common/atlas/apiClient.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import config from "../../config.js";
2-
import createClient, { Client, FetchOptions, Middleware } from "openapi-fetch";
2+
import createClient, { Client, Middleware } from "openapi-fetch";
3+
import type { FetchOptions } from "openapi-fetch";
34
import { AccessToken, ClientCredentials } from "simple-oauth2";
45
import { ApiClientError } from "./apiClientError.js";
56
import { paths, operations } from "./openapi.js";
@@ -65,7 +66,7 @@ export class ApiClient {
6566
baseUrl: options?.baseUrl || "https://cloud.mongodb.com/",
6667
userAgent:
6768
options?.userAgent ||
68-
`AtlasMCP/${config.version} (${process.platform}; ${process.arch}; ${process.env.HOSTNAME || "unknown"})`,
69+
`${config.mcp_server_name}/${config.version} (${process.platform}; ${process.arch}; ${process.env.HOSTNAME || "unknown"})`,
6970
};
7071

7172
this.client = createClient<paths>({

src/config.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,20 @@ const mergedUserConfig = {
3939
...getCliConfig(),
4040
};
4141

42+
43+
const machineMetadata = {
44+
device_id: "id", // TODO: use @mongodb-js/machine-id
45+
platform: process.platform,
46+
arch: process.arch,
47+
os_type: process.platform,
48+
os_version: process.version,
49+
}
50+
4251
const config = {
4352
...mergedUserConfig,
53+
...machineMetadata,
4454
version: packageJson.version,
55+
mcp_server_name: "MdbMcpServer"
4556
};
4657

4758
export default config;

src/index.ts

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,6 @@ import config from "./config.js";
88
import { Session } from "./session.js";
99
import { Server } from "./server.js";
1010

11-
const POLL_INTERVAL_MS = 2000; // 2 seconds
12-
const MAX_RETRIES = 15; // 30 seconds total
13-
const CLIENT_VERSION_TIMEOUT = new Error('Timeout waiting for client version');
14-
15-
async function pollClientVersion(mcpServer: McpServer): Promise<void> {
16-
let attempts = 0;
17-
18-
return new Promise((resolve, reject) => {
19-
const interval = setInterval(async () => {
20-
try {
21-
const client = await mcpServer.server.getClientVersion();
22-
if (client?.name && client?.version) {
23-
clearInterval(interval);
24-
logger.info(
25-
mongoLogId(1_000_003),
26-
"server",
27-
`Connected to client: ${client.name} v${client.version}`
28-
);
29-
resolve();
30-
} else if (++attempts >= MAX_RETRIES) {
31-
clearInterval(interval);
32-
reject(CLIENT_VERSION_TIMEOUT);
33-
}
34-
} catch (error: unknown) {
35-
clearInterval(interval);
36-
reject(error);
37-
}
38-
}, POLL_INTERVAL_MS);
39-
});
40-
}
4111

4212
async function main() {
4313
const session = new Session();
@@ -54,16 +24,6 @@ async function main() {
5424
const transport = new StdioServerTransport();
5525

5626
await server.connect(transport);
57-
try {
58-
await pollClientVersion(mcpServer);
59-
} catch (error) {
60-
logger.warning(
61-
mongoLogId(1_000_006),
62-
"server",
63-
"Client version information unavailable after 30 seconds"
64-
);
65-
66-
}
6727
}
6828

6929
// Start the server

src/server.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ 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 { getOsInfo } from '@mongodb-js/get-os-info';
8+
99

1010
export class Server {
1111
public readonly session: Session;
@@ -18,19 +18,19 @@ export class Server {
1818

1919
async connect(transport: Transport) {
2020
this.mcpServer.server.registerCapabilities({ logging: {} });
21-
22-
23-
// log telemetry
24-
const osInfo = await getOsInfo();
25-
logger.info(mongoLogId(1_000_005), "server", `Server started with osInfo ${JSON.stringify(osInfo)}`);
26-
2721
this.registerTools();
2822

2923
await initializeLogger(this.mcpServer);
3024

3125
await this.mcpServer.connect(transport);
3226

33-
logger.info(mongoLogId(1_000_004), "server", `Server started with transport ${transport.constructor.name}`);
27+
this.mcpServer.server.oninitialized = () => {
28+
const client = this.mcpServer.server.getClientVersion();
29+
this.session.clientName = client?.name;
30+
this.session.clientVersion = client?.version;
31+
32+
logger.info(mongoLogId(1_000_004), "server", `Server started with transport ${transport.constructor.name}`);
33+
};
3434
}
3535

3636
async close(): Promise<void> {

src/session.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
22
import { ApiClient } from "./common/atlas/apiClient.js";
33
import config from "./config.js";
4+
import logger from "./logger.js";
5+
import { mongoLogId } from "mongodb-log-writer";
46

57
export class Session {
8+
sessionId?: string;
69
serviceProvider?: NodeDriverServiceProvider;
710
apiClient?: ApiClient;
11+
clientName?: string;
12+
clientVersion?: string;
813

914
ensureAuthenticated(): asserts this is { apiClient: ApiClient } {
1015
if (!this.apiClient) {
@@ -34,4 +39,12 @@ export class Session {
3439
this.serviceProvider = undefined;
3540
}
3641
}
42+
43+
async emitTelemetry(todo: unknown): Promise<void> {
44+
logger.info(
45+
mongoLogId(1_000_001),
46+
"telemetry",
47+
`Telemetry event: ${JSON.stringify(todo)}`
48+
);
49+
}
3750
}

src/tools/atlas/atlasTool.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ToolBase, ToolCategory } from "../tool.js";
22
import { Session } from "../../session.js";
33

44
export abstract class AtlasToolBase extends ToolBase {
5+
protected category = "atlas";
56
constructor(protected readonly session: Session) {
67
super(session);
78
}

src/tools/tool.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export abstract class ToolBase {
2222

2323
protected abstract argsShape: ZodRawShape;
2424

25+
protected abstract category: string;
26+
2527
protected abstract execute(...args: Parameters<ToolCallback<typeof this.argsShape>>): Promise<CallToolResult>;
2628

2729
protected constructor(protected session: Session) {}
@@ -33,7 +35,6 @@ export abstract class ToolBase {
3335

3436
const callback: ToolCallback<typeof this.argsShape> = async (...args) => {
3537
try {
36-
// TODO: add telemetry here
3738
logger.debug(
3839
mongoLogId(1_000_006),
3940
"tool",

src/types/@mongodb-js/get-os-info.d.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)