mongodb-mcp-server 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +40 -0
- package/.github/workflows/code_health.yaml +21 -1
- package/.github/workflows/prepare_release.yaml +7 -1
- package/.vscode/launch.json +1 -1
- package/README.md +139 -53
- package/dist/common/atlas/apiClient.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/logger.js +3 -0
- package/dist/logger.js.map +1 -1
- package/dist/server.js +8 -19
- package/dist/server.js.map +1 -1
- package/dist/session.js +11 -12
- package/dist/session.js.map +1 -1
- package/dist/telemetry/constants.js +2 -2
- package/dist/telemetry/constants.js.map +1 -1
- package/dist/telemetry/device-id.js +20 -0
- package/dist/telemetry/device-id.js.map +1 -0
- package/dist/telemetry/telemetry.js +25 -28
- package/dist/telemetry/telemetry.js.map +1 -1
- package/dist/tools/atlas/atlasTool.js +32 -0
- package/dist/tools/atlas/atlasTool.js.map +1 -1
- package/dist/tools/atlas/metadata/connectCluster.js +21 -1
- package/dist/tools/atlas/metadata/connectCluster.js.map +1 -1
- package/dist/tools/atlas/read/inspectCluster.js +14 -3
- package/dist/tools/atlas/read/inspectCluster.js.map +1 -1
- package/dist/tools/atlas/read/listClusters.js +15 -4
- package/dist/tools/atlas/read/listClusters.js.map +1 -1
- package/dist/tools/mongodb/mongodbTool.js +10 -0
- package/dist/tools/mongodb/mongodbTool.js.map +1 -1
- package/dist/tools/tool.js +34 -25
- package/dist/tools/tool.js.map +1 -1
- package/eslint.config.js +2 -2
- package/{jest.config.js → jest.config.ts} +1 -1
- package/package.json +6 -5
- package/scripts/apply.ts +1 -0
- package/scripts/filter.ts +3 -0
- package/src/common/atlas/apiClient.ts +2 -2
- package/src/config.ts +1 -1
- package/src/logger.ts +3 -0
- package/src/server.ts +9 -24
- package/src/session.ts +10 -11
- package/src/telemetry/constants.ts +2 -2
- package/src/telemetry/device-id.ts +21 -0
- package/src/telemetry/eventCache.ts +1 -1
- package/src/telemetry/telemetry.ts +33 -30
- package/src/telemetry/types.ts +27 -29
- package/src/tools/atlas/atlasTool.ts +46 -1
- package/src/tools/atlas/metadata/connectCluster.ts +30 -1
- package/src/tools/atlas/read/inspectCluster.ts +28 -3
- package/src/tools/atlas/read/listClusters.ts +32 -4
- package/src/tools/mongodb/mongodbTool.ts +15 -1
- package/src/tools/tool.ts +50 -26
- package/tests/integration/helpers.ts +6 -8
- package/tests/integration/inMemoryTransport.ts +3 -3
- package/tests/integration/server.test.ts +4 -5
- package/tests/integration/tools/atlas/atlasHelpers.ts +3 -4
- package/tests/integration/tools/mongodb/mongodbHelpers.ts +6 -3
- package/tests/unit/telemetry.test.ts +37 -9
- package/tsconfig.build.json +19 -0
- package/tsconfig.jest.json +1 -3
- package/tsconfig.json +5 -15
- package/tsconfig.lint.json +0 -8
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createHmac } from "crypto";
|
|
2
|
+
import nodeMachineId from "node-machine-id";
|
|
3
|
+
import logger, { LogId } from "../logger.js";
|
|
4
|
+
export function getDeviceId() {
|
|
5
|
+
try {
|
|
6
|
+
const originalId = nodeMachineId.machineIdSync(true);
|
|
7
|
+
// Create a hashed format from the all uppercase version of the machine ID
|
|
8
|
+
// to match it exactly with the denisbrodbeck/machineid library that Atlas CLI uses.
|
|
9
|
+
const hmac = createHmac("sha256", originalId.toUpperCase());
|
|
10
|
+
/** This matches the message used to create the hashes in Atlas CLI */
|
|
11
|
+
const DEVICE_ID_HASH_MESSAGE = "atlascli";
|
|
12
|
+
hmac.update(DEVICE_ID_HASH_MESSAGE);
|
|
13
|
+
return hmac.digest("hex");
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
logger.debug(LogId.telemetryDeviceIdFailure, "telemetry", String(error));
|
|
17
|
+
return "unknown";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=device-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-id.js","sourceRoot":"","sources":["../../src/telemetry/device-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,WAAW;IACvB,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACrD,0EAA0E;QAC1E,oFAAoF;QACpF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAE5D,sEAAsE;QACtE,MAAM,sBAAsB,GAAG,UAAU,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC"}
|
|
@@ -1,44 +1,23 @@
|
|
|
1
|
-
import { config } from "../config.js";
|
|
2
1
|
import logger, { LogId } from "../logger.js";
|
|
3
2
|
import { MACHINE_METADATA } from "./constants.js";
|
|
4
3
|
import { EventCache } from "./eventCache.js";
|
|
5
4
|
export class Telemetry {
|
|
6
|
-
constructor(session, eventCache = EventCache.getInstance()) {
|
|
5
|
+
constructor(session, userConfig, eventCache = EventCache.getInstance()) {
|
|
7
6
|
this.session = session;
|
|
7
|
+
this.userConfig = userConfig;
|
|
8
8
|
this.eventCache = eventCache;
|
|
9
9
|
this.commonProperties = {
|
|
10
10
|
...MACHINE_METADATA,
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Checks if telemetry is currently enabled
|
|
15
|
-
* This is a method rather than a constant to capture runtime config changes
|
|
16
|
-
*
|
|
17
|
-
* Follows the Console Do Not Track standard (https://consoledonottrack.com/)
|
|
18
|
-
* by respecting the DO_NOT_TRACK environment variable
|
|
19
|
-
*/
|
|
20
|
-
static isTelemetryEnabled() {
|
|
21
|
-
// Check if telemetry is explicitly disabled in config
|
|
22
|
-
if (config.telemetry === "disabled") {
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
const doNotTrack = process.env.DO_NOT_TRACK;
|
|
26
|
-
if (doNotTrack) {
|
|
27
|
-
const value = doNotTrack.toLowerCase();
|
|
28
|
-
// Telemetry should be disabled if DO_NOT_TRACK is "1", "true", or "yes"
|
|
29
|
-
if (value === "1" || value === "true" || value === "yes") {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
13
|
/**
|
|
36
14
|
* Emits events through the telemetry pipeline
|
|
37
15
|
* @param events - The events to emit
|
|
38
16
|
*/
|
|
39
17
|
async emitEvents(events) {
|
|
40
18
|
try {
|
|
41
|
-
if (!
|
|
19
|
+
if (!this.isTelemetryEnabled()) {
|
|
20
|
+
logger.info(LogId.telemetryEmitFailure, "telemetry", `Telemetry is disabled.`);
|
|
42
21
|
return;
|
|
43
22
|
}
|
|
44
23
|
await this.emit(events);
|
|
@@ -58,9 +37,24 @@ export class Telemetry {
|
|
|
58
37
|
mcp_client_name: this.session.agentRunner?.name,
|
|
59
38
|
session_id: this.session.sessionId,
|
|
60
39
|
config_atlas_auth: this.session.apiClient.hasCredentials() ? "true" : "false",
|
|
61
|
-
config_connection_string:
|
|
40
|
+
config_connection_string: this.userConfig.connectionString ? "true" : "false",
|
|
62
41
|
};
|
|
63
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if telemetry is currently enabled
|
|
45
|
+
* This is a method rather than a constant to capture runtime config changes
|
|
46
|
+
*
|
|
47
|
+
* Follows the Console Do Not Track standard (https://consoledonottrack.com/)
|
|
48
|
+
* by respecting the DO_NOT_TRACK environment variable
|
|
49
|
+
*/
|
|
50
|
+
isTelemetryEnabled() {
|
|
51
|
+
// Check if telemetry is explicitly disabled in config
|
|
52
|
+
if (this.userConfig.telemetry === "disabled") {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const doNotTrack = "DO_NOT_TRACK" in process.env;
|
|
56
|
+
return !doNotTrack;
|
|
57
|
+
}
|
|
64
58
|
/**
|
|
65
59
|
* Attempts to emit events through authenticated and unauthenticated clients
|
|
66
60
|
* Falls back to caching if both attempts fail
|
|
@@ -72,7 +66,7 @@ export class Telemetry {
|
|
|
72
66
|
const result = await this.sendEvents(this.session.apiClient, allEvents);
|
|
73
67
|
if (result.success) {
|
|
74
68
|
this.eventCache.clearEvents();
|
|
75
|
-
logger.debug(LogId.telemetryEmitSuccess, "telemetry", `Sent ${allEvents.length} events successfully`);
|
|
69
|
+
logger.debug(LogId.telemetryEmitSuccess, "telemetry", `Sent ${allEvents.length} events successfully: ${JSON.stringify(allEvents, null, 2)}`);
|
|
76
70
|
return;
|
|
77
71
|
}
|
|
78
72
|
logger.debug(LogId.telemetryEmitFailure, "telemetry", `Error sending event to client: ${result.error instanceof Error ? result.error.message : String(result.error)}`);
|
|
@@ -83,7 +77,10 @@ export class Telemetry {
|
|
|
83
77
|
*/
|
|
84
78
|
async sendEvents(client, events) {
|
|
85
79
|
try {
|
|
86
|
-
await client.sendEvents(events)
|
|
80
|
+
await client.sendEvents(events.map((event) => ({
|
|
81
|
+
...event,
|
|
82
|
+
properties: { ...this.getCommonProperties(), ...event.properties },
|
|
83
|
+
})));
|
|
87
84
|
return { success: true };
|
|
88
85
|
}
|
|
89
86
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { ToolBase } from "../tool.js";
|
|
2
|
+
import logger, { LogId } from "../../logger.js";
|
|
3
|
+
import { z } from "zod";
|
|
2
4
|
export class AtlasToolBase extends ToolBase {
|
|
3
5
|
constructor() {
|
|
4
6
|
super(...arguments);
|
|
@@ -10,5 +12,35 @@ export class AtlasToolBase extends ToolBase {
|
|
|
10
12
|
}
|
|
11
13
|
return super.verifyAllowed();
|
|
12
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* Resolves the tool metadata from the arguments passed to the tool
|
|
18
|
+
*
|
|
19
|
+
* @param args - The arguments passed to the tool
|
|
20
|
+
* @returns The tool metadata
|
|
21
|
+
*/
|
|
22
|
+
resolveTelemetryMetadata(...args) {
|
|
23
|
+
const toolMetadata = {};
|
|
24
|
+
if (!args.length) {
|
|
25
|
+
return toolMetadata;
|
|
26
|
+
}
|
|
27
|
+
// Create a typed parser for the exact shape we expect
|
|
28
|
+
const argsShape = z.object(this.argsShape);
|
|
29
|
+
const parsedResult = argsShape.safeParse(args[0]);
|
|
30
|
+
if (!parsedResult.success) {
|
|
31
|
+
logger.debug(LogId.telemetryMetadataError, "tool", `Error parsing tool arguments: ${parsedResult.error.message}`);
|
|
32
|
+
return toolMetadata;
|
|
33
|
+
}
|
|
34
|
+
const data = parsedResult.data;
|
|
35
|
+
// Extract projectId using type guard
|
|
36
|
+
if ("projectId" in data && typeof data.projectId === "string" && data.projectId.trim() !== "") {
|
|
37
|
+
toolMetadata.projectId = data.projectId;
|
|
38
|
+
}
|
|
39
|
+
// Extract orgId using type guard
|
|
40
|
+
if ("orgId" in data && typeof data.orgId === "string" && data.orgId.trim() !== "") {
|
|
41
|
+
toolMetadata.orgId = data.orgId;
|
|
42
|
+
}
|
|
43
|
+
return toolMetadata;
|
|
44
|
+
}
|
|
13
45
|
}
|
|
14
46
|
//# sourceMappingURL=atlasTool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atlasTool.js","sourceRoot":"","sources":["../../../src/tools/atlas/atlasTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"atlasTool.js","sourceRoot":"","sources":["../../../src/tools/atlas/atlasTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuC,MAAM,YAAY,CAAC;AAE3E,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,OAAgB,aAAc,SAAQ,QAAQ;IAApD;;QACc,aAAQ,GAAiB,OAAO,CAAC;IAkD/C,CAAC;IAhDa,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC;IAED;;;;;;OAMG;IACO,wBAAwB,CAC9B,GAAG,IAAqD;QAExD,MAAM,YAAY,GAA0B,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,YAAY,CAAC;QACxB,CAAC;QAED,sDAAsD;QACtD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CACR,KAAK,CAAC,sBAAsB,EAC5B,MAAM,EACN,iCAAiC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAChE,CAAC;YACF,OAAO,YAAY,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAE/B,qCAAqC;QACrC,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5F,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5C,CAAC;QAED,iCAAiC;QACjC,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChF,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACpC,CAAC;QACD,OAAO,YAAY,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { AtlasToolBase } from "../atlasTool.js";
|
|
3
3
|
import { randomBytes } from "crypto";
|
|
4
4
|
import { promisify } from "util";
|
|
5
|
+
import logger, { LogId } from "../../../logger.js";
|
|
5
6
|
const EXPIRY_MS = 1000 * 60 * 60 * 12; // 12 hours
|
|
6
7
|
const randomBytesAsync = promisify(randomBytes);
|
|
7
8
|
async function generateSecurePassword() {
|
|
@@ -9,6 +10,9 @@ async function generateSecurePassword() {
|
|
|
9
10
|
const pass = buf.toString("base64url");
|
|
10
11
|
return pass;
|
|
11
12
|
}
|
|
13
|
+
function sleep(ms) {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
15
|
+
}
|
|
12
16
|
export class ConnectClusterTool extends AtlasToolBase {
|
|
13
17
|
constructor() {
|
|
14
18
|
super(...arguments);
|
|
@@ -83,7 +87,23 @@ export class ConnectClusterTool extends AtlasToolBase {
|
|
|
83
87
|
cn.password = password;
|
|
84
88
|
cn.searchParams.set("authSource", "admin");
|
|
85
89
|
const connectionString = cn.toString();
|
|
86
|
-
|
|
90
|
+
let lastError = undefined;
|
|
91
|
+
for (let i = 0; i < 20; i++) {
|
|
92
|
+
try {
|
|
93
|
+
await this.session.connectToMongoDB(connectionString, this.config.connectOptions);
|
|
94
|
+
lastError = undefined;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
99
|
+
lastError = error;
|
|
100
|
+
logger.debug(LogId.atlasConnectFailure, "atlas-connect-cluster", `error connecting to cluster: ${error.message}`);
|
|
101
|
+
await sleep(500); // wait for 500ms before retrying
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (lastError) {
|
|
105
|
+
throw lastError;
|
|
106
|
+
}
|
|
87
107
|
return {
|
|
88
108
|
content: [
|
|
89
109
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectCluster.js","sourceRoot":"","sources":["../../../../src/tools/atlas/metadata/connectCluster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"connectCluster.js","sourceRoot":"","sources":["../../../../src/tools/atlas/metadata/connectCluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,13 +26,24 @@ export class InspectClusterTool extends AtlasToolBase {
|
|
|
26
26
|
if (!cluster) {
|
|
27
27
|
throw new Error("Cluster not found");
|
|
28
28
|
}
|
|
29
|
+
const regionConfigs = (cluster.replicationSpecs || [])
|
|
30
|
+
.map((replicationSpec) => (replicationSpec.regionConfigs || []))
|
|
31
|
+
.flat()
|
|
32
|
+
.map((regionConfig) => {
|
|
33
|
+
return {
|
|
34
|
+
providerName: regionConfig.providerName,
|
|
35
|
+
instanceSize: regionConfig.electableSpecs?.instanceSize || regionConfig.readOnlySpecs?.instanceSize,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
const instanceSize = (regionConfigs.length <= 0 ? undefined : regionConfigs[0].instanceSize) || "UNKNOWN";
|
|
39
|
+
const clusterInstanceType = instanceSize == "M0" ? "FREE" : "DEDICATED";
|
|
29
40
|
return {
|
|
30
41
|
content: [
|
|
31
42
|
{
|
|
32
43
|
type: "text",
|
|
33
|
-
text: `Cluster Name | State | MongoDB Version | Connection String
|
|
34
|
-
|
|
35
|
-
${cluster.name} | ${cluster.stateName} | ${cluster.mongoDBVersion || "N/A"} | ${cluster.connectionStrings?.standard || "N/A"}`,
|
|
44
|
+
text: `Cluster Name | Cluster Type | Tier | State | MongoDB Version | Connection String
|
|
45
|
+
----------------|----------------|----------------|----------------|----------------|----------------
|
|
46
|
+
${cluster.name} | ${clusterInstanceType} | ${clusterInstanceType == "DEDICATED" ? instanceSize : "N/A"} | ${cluster.stateName} | ${cluster.mongoDBVersion || "N/A"} | ${cluster.connectionStrings?.standardSrv || cluster.connectionStrings?.standard || "N/A"}`,
|
|
36
47
|
},
|
|
37
48
|
],
|
|
38
49
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspectCluster.js","sourceRoot":"","sources":["../../../../src/tools/atlas/read/inspectCluster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAArD;;QACc,SAAI,GAAG,uBAAuB,CAAC;QAC/B,gBAAW,GAAG,+BAA+B,CAAC;QAC9C,kBAAa,GAAkB,MAAM,CAAC;QACtC,cAAS,GAAG;YAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;SACzD,CAAC;
|
|
1
|
+
{"version":3,"file":"inspectCluster.js","sourceRoot":"","sources":["../../../../src/tools/atlas/read/inspectCluster.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAArD;;QACc,SAAI,GAAG,uBAAuB,CAAC;QAC/B,gBAAW,GAAG,+BAA+B,CAAC;QAC9C,kBAAa,GAAkB,MAAM,CAAC;QACtC,cAAS,GAAG;YAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;SACzD,CAAC;IAwDN,CAAC;IAtDa,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,EAAmC;QAC/E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;YACpD,MAAM,EAAE;gBACJ,IAAI,EAAE;oBACF,OAAO,EAAE,SAAS;oBAClB,WAAW;iBACd;aACJ;SACJ,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEO,YAAY,CAAC,OAAoC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;aACjD,GAAG,CACA,CAAC,eAAe,EAAE,EAAE,CAChB,CAAC,eAAe,CAAC,aAAa,IAAI,EAAE,CAQjC,CACV;aACA,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;YAClB,OAAO;gBACH,YAAY,EAAE,YAAY,CAAC,YAAY;gBACvC,YAAY,EAAE,YAAY,CAAC,cAAc,EAAE,YAAY,IAAI,YAAY,CAAC,aAAa,EAAE,YAAY;aACtG,CAAC;QACN,CAAC,CAAC,CAAC;QAEP,MAAM,YAAY,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;QAE1G,MAAM,mBAAmB,GAAG,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QAExE,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;;EAExB,OAAO,CAAC,IAAI,MAAM,mBAAmB,MAAM,mBAAmB,IAAI,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,cAAc,IAAI,KAAK,MAAM,OAAO,CAAC,iBAAiB,EAAE,WAAW,IAAI,OAAO,CAAC,iBAAiB,EAAE,QAAQ,IAAI,KAAK,EAAE;iBAC/O;aACJ;SACJ,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -72,9 +72,20 @@ ${rows}`,
|
|
|
72
72
|
}
|
|
73
73
|
const rows = clusters.results
|
|
74
74
|
.map((cluster) => {
|
|
75
|
-
const connectionString = cluster.connectionStrings?.standard || "N/A";
|
|
75
|
+
const connectionString = cluster.connectionStrings?.standardSrv || cluster.connectionStrings?.standard || "N/A";
|
|
76
76
|
const mongoDBVersion = cluster.mongoDBVersion || "N/A";
|
|
77
|
-
|
|
77
|
+
const regionConfigs = (cluster.replicationSpecs || [])
|
|
78
|
+
.map((replicationSpec) => (replicationSpec.regionConfigs || []))
|
|
79
|
+
.flat()
|
|
80
|
+
.map((regionConfig) => {
|
|
81
|
+
return {
|
|
82
|
+
providerName: regionConfig.providerName,
|
|
83
|
+
instanceSize: regionConfig.electableSpecs?.instanceSize || regionConfig.readOnlySpecs?.instanceSize,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
const instanceSize = (regionConfigs.length <= 0 ? undefined : regionConfigs[0].instanceSize) || "UNKNOWN";
|
|
87
|
+
const clusterInstanceType = instanceSize == "M0" ? "FREE" : "DEDICATED";
|
|
88
|
+
return `${cluster.name} | ${clusterInstanceType} | ${clusterInstanceType == "DEDICATED" ? instanceSize : "N/A"} | ${cluster.stateName} | ${mongoDBVersion} | ${connectionString}`;
|
|
78
89
|
})
|
|
79
90
|
.join("\n");
|
|
80
91
|
return {
|
|
@@ -85,8 +96,8 @@ ${rows}`,
|
|
|
85
96
|
},
|
|
86
97
|
{
|
|
87
98
|
type: "text",
|
|
88
|
-
text: `Cluster Name | State | MongoDB Version | Connection String
|
|
89
|
-
|
|
99
|
+
text: `Cluster Name | Cluster Type | Tier | State | MongoDB Version | Connection String
|
|
100
|
+
----------------|----------------|----------------|----------------|----------------|----------------
|
|
90
101
|
${rows}`,
|
|
91
102
|
},
|
|
92
103
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listClusters.js","sourceRoot":"","sources":["../../../../src/tools/atlas/read/listClusters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IAAnD;;QACc,SAAI,GAAG,qBAAqB,CAAC;QAC7B,gBAAW,GAAG,6BAA6B,CAAC;QAC5C,kBAAa,GAAkB,MAAM,CAAC;QACtC,cAAS,GAAG;YAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC,QAAQ,EAAE;SACnF,CAAC;
|
|
1
|
+
{"version":3,"file":"listClusters.js","sourceRoot":"","sources":["../../../../src/tools/atlas/read/listClusters.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,5 +60,15 @@ export class MongoDBToolBase extends ToolBase {
|
|
|
60
60
|
connectToMongoDB(connectionString) {
|
|
61
61
|
return this.session.connectToMongoDB(connectionString, this.config.connectOptions);
|
|
62
62
|
}
|
|
63
|
+
resolveTelemetryMetadata(
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
65
|
+
args) {
|
|
66
|
+
const metadata = {};
|
|
67
|
+
// Add projectId to the metadata if running a MongoDB operation to an Atlas cluster
|
|
68
|
+
if (this.session.connectedAtlasCluster?.projectId) {
|
|
69
|
+
metadata.projectId = this.session.connectedAtlasCluster.projectId;
|
|
70
|
+
}
|
|
71
|
+
return metadata;
|
|
72
|
+
}
|
|
63
73
|
}
|
|
64
74
|
//# sourceMappingURL=mongodbTool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodbTool.js","sourceRoot":"","sources":["../../../src/tools/mongodb/mongodbTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,QAAQ,
|
|
1
|
+
{"version":3,"file":"mongodbTool.js","sourceRoot":"","sources":["../../../src/tools/mongodb/mongodbTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,QAAQ,EAAuC,MAAM,YAAY,CAAC;AAGrF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrD,CAAC;AAEF,MAAM,OAAgB,eAAgB,SAAQ,QAAQ;IAAtD;;QACc,aAAQ,GAAiB,SAAS,CAAC;IA4EjD,CAAC;IA1Ea,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAChE,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CACR,KAAK,CAAC,qBAAqB,EAC3B,aAAa,EACb,sFAAsF,KAAe,EAAE,CAC1G,CAAC;gBACF,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,CAAC;YAClG,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACxC,CAAC;IAES,WAAW,CACjB,KAAc,EACd,IAAqC;QAErC,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;YAChC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,UAAU,CAAC,qBAAqB;oBACjC,OAAO;wBACH,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,2EAA2E;6BACpF;4BACD;gCACI,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,wFAAwF;6BACjG;yBACJ;wBACD,OAAO,EAAE,IAAI;qBAChB,CAAC;gBACN,KAAK,UAAU,CAAC,6BAA6B;oBACzC,OAAO;wBACH,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,0NAA0N;6BACnO;yBACJ;wBACD,OAAO,EAAE,IAAI;qBAChB,CAAC;YACV,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAES,gBAAgB,CAAC,gBAAwB;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACvF,CAAC;IAES,wBAAwB;IAC9B,6DAA6D;IAC7D,IAAqC;QAErC,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAE3C,mFAAmF;QACnF,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,SAAS,EAAE,CAAC;YAChD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC;QACtE,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
|
package/dist/tools/tool.js
CHANGED
|
@@ -5,28 +5,6 @@ export class ToolBase {
|
|
|
5
5
|
this.config = config;
|
|
6
6
|
this.telemetry = telemetry;
|
|
7
7
|
}
|
|
8
|
-
/**
|
|
9
|
-
* Creates and emits a tool telemetry event
|
|
10
|
-
* @param startTime - Start time in milliseconds
|
|
11
|
-
* @param result - Whether the command succeeded or failed
|
|
12
|
-
* @param error - Optional error if the command failed
|
|
13
|
-
*/
|
|
14
|
-
async emitToolEvent(startTime, result) {
|
|
15
|
-
const duration = Date.now() - startTime;
|
|
16
|
-
const event = {
|
|
17
|
-
timestamp: new Date().toISOString(),
|
|
18
|
-
source: "mdbmcp",
|
|
19
|
-
properties: {
|
|
20
|
-
...this.telemetry.getCommonProperties(),
|
|
21
|
-
command: this.name,
|
|
22
|
-
category: this.category,
|
|
23
|
-
component: "tool",
|
|
24
|
-
duration_ms: duration,
|
|
25
|
-
result: result.isError ? "failure" : "success",
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
await this.telemetry.emitEvents([event]);
|
|
29
|
-
}
|
|
30
8
|
register(server) {
|
|
31
9
|
if (!this.verifyAllowed()) {
|
|
32
10
|
return;
|
|
@@ -36,13 +14,13 @@ export class ToolBase {
|
|
|
36
14
|
try {
|
|
37
15
|
logger.debug(LogId.toolExecute, "tool", `Executing ${this.name} with args: ${JSON.stringify(args)}`);
|
|
38
16
|
const result = await this.execute(...args);
|
|
39
|
-
await this.emitToolEvent(startTime, result);
|
|
17
|
+
await this.emitToolEvent(startTime, result, ...args).catch(() => { });
|
|
40
18
|
return result;
|
|
41
19
|
}
|
|
42
20
|
catch (error) {
|
|
43
21
|
logger.error(LogId.toolExecuteFailure, "tool", `Error executing ${this.name}: ${error}`);
|
|
44
22
|
const toolResult = await this.handleError(error, args[0]);
|
|
45
|
-
await this.emitToolEvent(startTime, toolResult).catch(() => { });
|
|
23
|
+
await this.emitToolEvent(startTime, toolResult, ...args).catch(() => { });
|
|
46
24
|
return toolResult;
|
|
47
25
|
}
|
|
48
26
|
};
|
|
@@ -100,10 +78,41 @@ export class ToolBase {
|
|
|
100
78
|
{
|
|
101
79
|
type: "text",
|
|
102
80
|
text: `Error running ${this.name}: ${error instanceof Error ? error.message : String(error)}`,
|
|
103
|
-
isError: true,
|
|
104
81
|
},
|
|
105
82
|
],
|
|
83
|
+
isError: true,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Creates and emits a tool telemetry event
|
|
88
|
+
* @param startTime - Start time in milliseconds
|
|
89
|
+
* @param result - Whether the command succeeded or failed
|
|
90
|
+
* @param args - The arguments passed to the tool
|
|
91
|
+
*/
|
|
92
|
+
async emitToolEvent(startTime, result, ...args) {
|
|
93
|
+
if (!this.telemetry.isTelemetryEnabled()) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const duration = Date.now() - startTime;
|
|
97
|
+
const metadata = this.resolveTelemetryMetadata(...args);
|
|
98
|
+
const event = {
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
source: "mdbmcp",
|
|
101
|
+
properties: {
|
|
102
|
+
command: this.name,
|
|
103
|
+
category: this.category,
|
|
104
|
+
component: "tool",
|
|
105
|
+
duration_ms: duration,
|
|
106
|
+
result: result.isError ? "failure" : "success",
|
|
107
|
+
},
|
|
106
108
|
};
|
|
109
|
+
if (metadata?.orgId) {
|
|
110
|
+
event.properties.org_id = metadata.orgId;
|
|
111
|
+
}
|
|
112
|
+
if (metadata?.projectId) {
|
|
113
|
+
event.properties.project_id = metadata.projectId;
|
|
114
|
+
}
|
|
115
|
+
await this.telemetry.emitEvents([event]);
|
|
107
116
|
}
|
|
108
117
|
}
|
|
109
118
|
//# sourceMappingURL=tool.js.map
|
package/dist/tools/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAIA,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"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"}
|
package/eslint.config.js
CHANGED
|
@@ -29,7 +29,7 @@ export default defineConfig([
|
|
|
29
29
|
files,
|
|
30
30
|
languageOptions: {
|
|
31
31
|
parserOptions: {
|
|
32
|
-
project: "./tsconfig.
|
|
32
|
+
project: "./tsconfig.json",
|
|
33
33
|
tsconfigRootDir: import.meta.dirname,
|
|
34
34
|
},
|
|
35
35
|
},
|
|
@@ -48,7 +48,7 @@ export default defineConfig([
|
|
|
48
48
|
"coverage",
|
|
49
49
|
"global.d.ts",
|
|
50
50
|
"eslint.config.js",
|
|
51
|
-
"jest.config.
|
|
51
|
+
"jest.config.ts",
|
|
52
52
|
]),
|
|
53
53
|
eslintPluginPrettierRecommended,
|
|
54
54
|
]);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mongodb-mcp-server",
|
|
3
3
|
"description": "MongoDB Model Context Protocol Server",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.8",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"author": "MongoDB <info@mongodb.com>",
|
|
7
7
|
"homepage": "https://github.com/mongodb-js/mongodb-mcp-server",
|
|
@@ -18,17 +18,18 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"prepare": "npm run build",
|
|
20
20
|
"build:clean": "rm -rf dist",
|
|
21
|
-
"build:compile": "tsc",
|
|
21
|
+
"build:compile": "tsc --project tsconfig.build.json",
|
|
22
22
|
"build:chmod": "chmod +x dist/index.js",
|
|
23
23
|
"build": "npm run build:clean && npm run build:compile && npm run build:chmod",
|
|
24
24
|
"inspect": "npm run build && mcp-inspector -- dist/index.js",
|
|
25
25
|
"prettier": "prettier",
|
|
26
|
-
"check": "npm run build && npm run check:lint && npm run check:format",
|
|
26
|
+
"check": "npm run build && npm run check:types && npm run check:lint && npm run check:format",
|
|
27
27
|
"check:lint": "eslint .",
|
|
28
28
|
"check:format": "prettier -c .",
|
|
29
|
+
"check:types": "tsc --noEmit --project tsconfig.json",
|
|
29
30
|
"reformat": "prettier --write .",
|
|
30
31
|
"generate": "./scripts/generate.sh",
|
|
31
|
-
"test": "jest --coverage"
|
|
32
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage"
|
|
32
33
|
},
|
|
33
34
|
"license": "Apache-2.0",
|
|
34
35
|
"devDependencies": {
|
|
@@ -49,7 +50,6 @@
|
|
|
49
50
|
"jest-environment-node": "^29.7.0",
|
|
50
51
|
"jest-extended": "^4.0.2",
|
|
51
52
|
"mongodb-runner": "^5.8.2",
|
|
52
|
-
"native-machine-id": "^0.1.0",
|
|
53
53
|
"openapi-types": "^12.1.3",
|
|
54
54
|
"openapi-typescript": "^7.6.1",
|
|
55
55
|
"prettier": "^3.5.3",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
"mongodb-log-writer": "^2.4.1",
|
|
70
70
|
"mongodb-redact": "^1.1.6",
|
|
71
71
|
"mongodb-schema": "^12.6.2",
|
|
72
|
+
"node-machine-id": "^1.1.12",
|
|
72
73
|
"openapi-fetch": "^0.13.5",
|
|
73
74
|
"simple-oauth2": "^5.1.0",
|
|
74
75
|
"yargs-parser": "^21.1.1",
|
package/scripts/apply.ts
CHANGED
|
@@ -44,6 +44,7 @@ async function main() {
|
|
|
44
44
|
const openapi = JSON.parse(specFile) as OpenAPIV3_1.Document;
|
|
45
45
|
for (const path in openapi.paths) {
|
|
46
46
|
for (const method in openapi.paths[path]) {
|
|
47
|
+
// @ts-expect-error This is a workaround for the OpenAPI types
|
|
47
48
|
const operation = openapi.paths[path][method] as OpenAPIV3_1.OperationObject;
|
|
48
49
|
|
|
49
50
|
if (!operation.operationId || !operation.tags?.length) {
|
package/scripts/filter.ts
CHANGED
|
@@ -43,11 +43,14 @@ function filterOpenapi(openapi: OpenAPIV3_1.Document): OpenAPIV3_1.Document {
|
|
|
43
43
|
for (const path in openapi.paths) {
|
|
44
44
|
const filteredMethods = {} as OpenAPIV3_1.PathItemObject;
|
|
45
45
|
for (const method in openapi.paths[path]) {
|
|
46
|
+
// @ts-expect-error This is a workaround for the OpenAPI types
|
|
46
47
|
if (allowedOperations.includes((openapi.paths[path][method] as { operationId: string }).operationId)) {
|
|
48
|
+
// @ts-expect-error This is a workaround for the OpenAPI types
|
|
47
49
|
filteredMethods[method] = openapi.paths[path][method] as OpenAPIV3_1.OperationObject;
|
|
48
50
|
}
|
|
49
51
|
}
|
|
50
52
|
if (Object.keys(filteredMethods).length > 0) {
|
|
53
|
+
// @ts-expect-error This is a workaround for the OpenAPI types
|
|
51
54
|
filteredPaths[path] = filteredMethods;
|
|
52
55
|
}
|
|
53
56
|
}
|
|
@@ -3,7 +3,7 @@ import type { FetchOptions } from "openapi-fetch";
|
|
|
3
3
|
import { AccessToken, ClientCredentials } from "simple-oauth2";
|
|
4
4
|
import { ApiClientError } from "./apiClientError.js";
|
|
5
5
|
import { paths, operations } from "./openapi.js";
|
|
6
|
-
import {
|
|
6
|
+
import { CommonProperties, TelemetryEvent } from "../../telemetry/types.js";
|
|
7
7
|
import { packageInfo } from "../../packageInfo.js";
|
|
8
8
|
|
|
9
9
|
const ATLAS_API_VERSION = "2025-03-12";
|
|
@@ -123,7 +123,7 @@ export class ApiClient {
|
|
|
123
123
|
}>;
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
async sendEvents(events:
|
|
126
|
+
async sendEvents(events: TelemetryEvent<CommonProperties>[]): Promise<void> {
|
|
127
127
|
let endpoint = "api/private/unauth/telemetry/events";
|
|
128
128
|
const headers: Record<string, string> = {
|
|
129
129
|
Accept: "application/json",
|
package/src/config.ts
CHANGED
package/src/logger.ts
CHANGED
|
@@ -12,11 +12,14 @@ export const LogId = {
|
|
|
12
12
|
|
|
13
13
|
atlasCheckCredentials: mongoLogId(1_001_001),
|
|
14
14
|
atlasDeleteDatabaseUserFailure: mongoLogId(1_001_002),
|
|
15
|
+
atlasConnectFailure: mongoLogId(1_001_003),
|
|
15
16
|
|
|
16
17
|
telemetryDisabled: mongoLogId(1_002_001),
|
|
17
18
|
telemetryEmitFailure: mongoLogId(1_002_002),
|
|
18
19
|
telemetryEmitStart: mongoLogId(1_002_003),
|
|
19
20
|
telemetryEmitSuccess: mongoLogId(1_002_004),
|
|
21
|
+
telemetryMetadataError: mongoLogId(1_002_005),
|
|
22
|
+
telemetryDeviceIdFailure: mongoLogId(1_002_006),
|
|
20
23
|
|
|
21
24
|
toolExecute: mongoLogId(1_003_001),
|
|
22
25
|
toolExecuteFailure: mongoLogId(1_003_002),
|