@mongodb-js/mcp-setup 3.0.0-prerelease.1

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.
@@ -0,0 +1,205 @@
1
+ import { randomUUID } from "crypto";
2
+ import { ApiClient, userAgentFromServerMetadata } from "@mongodb-js/mcp-atlas-api-client";
3
+ import { getDefaultHttpClient } from "@mongodb-js/mcp-fetch";
4
+ import { NoopLogger } from "@mongodb-js/mcp-core";
5
+ import { DeviceId } from "@mongodb-js/mcp-tools-mongodb";
6
+ import { AtlasTelemetry } from "@mongodb-js/mcp-atlas-telemetry";
7
+ export const toBoolSet = (value) => {
8
+ if (value === undefined) {
9
+ return undefined;
10
+ }
11
+ return value ? "true" : "false";
12
+ };
13
+ /**
14
+ * Per-run helper that owns the setup telemetry session: assigns the
15
+ * `setup_session_id`, tracks wall-clock durations, and
16
+ * accumulates context so every event carries the full set of known flags.
17
+ *
18
+ * One instance is constructed per `runSetup` invocation. Callers emit typed
19
+ * events at each logical step and call {@link flush} before the process
20
+ * exits so buffered events are best-effort sent.
21
+ */
22
+ export class SetupTelemetry {
23
+ /**
24
+ * Builds a fully-wired {@link SetupTelemetry} for the setup CLI: a silent
25
+ * logger (so telemetry's internal logging doesn't leak into the
26
+ * interactive wizard), a fresh {@link DeviceId}, an unauthenticated
27
+ * {@link ApiClient}, and an {@link AtlasTelemetry} instance.
28
+ */
29
+ static create({ config, keychain, serverMetadata, }) {
30
+ const logger = new NoopLogger();
31
+ const deviceId = DeviceId.create(logger);
32
+ // Shared, memoized proxy-aware fetch (see @mongodb-js/mcp-fetch).
33
+ const httpClient = getDefaultHttpClient();
34
+ const apiClient = new ApiClient({
35
+ baseUrl: config.apiBaseUrl,
36
+ userAgent: userAgentFromServerMetadata(serverMetadata),
37
+ httpClient,
38
+ }, logger);
39
+ const telemetry = AtlasTelemetry.create({
40
+ logger,
41
+ deviceId,
42
+ apiClient,
43
+ keychain,
44
+ enabled: config.telemetry === "enabled",
45
+ serverMetadata,
46
+ });
47
+ return new SetupTelemetry({ telemetry, deviceId });
48
+ }
49
+ /**
50
+ * Direct construction is primarily for tests that want to inject a mock
51
+ * telemetry pipeline. Production code should use {@link SetupTelemetry.create}.
52
+ */
53
+ constructor({ telemetry, deviceId }) {
54
+ this.setupSessionId = randomUUID();
55
+ this.startedAt = Date.now();
56
+ this.stepStartedAt = this.startedAt;
57
+ this.context = {};
58
+ this.telemetry = telemetry;
59
+ this.deviceId = deviceId;
60
+ }
61
+ /**
62
+ * Merges new context values into the accumulated context. Subsequent
63
+ * events will automatically carry the updated values.
64
+ */
65
+ updateContext(patch) {
66
+ this.context = { ...this.context, ...patch };
67
+ }
68
+ /**
69
+ * Emits a single setup event. `duration_ms` is computed from the time
70
+ * elapsed since the previous step (or setup start), and `result`
71
+ * defaults to "success" — callers pass "failure" only when the step's
72
+ * own code path failed (e.g. writing the editor config threw).
73
+ */
74
+ emit(stage, extra = {}, result = "success") {
75
+ const now = Date.now();
76
+ const event = {
77
+ timestamp: new Date(now).toISOString(),
78
+ source: "mdbmcp",
79
+ properties: {
80
+ component: "setup",
81
+ category: "setup",
82
+ duration_ms: now - this.stepStartedAt,
83
+ result,
84
+ stage,
85
+ setup_session_id: this.setupSessionId,
86
+ ...this.context,
87
+ ...extra,
88
+ },
89
+ };
90
+ this.telemetry.emitEvents([event]);
91
+ this.stepStartedAt = now;
92
+ this.lastStep = stage;
93
+ }
94
+ emitStarted() {
95
+ this.emit("started");
96
+ }
97
+ emitPrerequisitesChecked(props) {
98
+ this.updateContext({
99
+ node_version_ok: toBoolSet(props.nodeVersionOk),
100
+ has_docker: toBoolSet(props.hasDocker),
101
+ });
102
+ this.emit("prerequisites_checked");
103
+ }
104
+ emitAiToolSelected(aiTool) {
105
+ this.updateContext({ ai_tool: aiTool });
106
+ this.emit("ai_tool_selected");
107
+ }
108
+ emitReadOnlySelected(isReadOnly) {
109
+ this.updateContext({ read_only_mode: toBoolSet(isReadOnly) });
110
+ this.emit("read_only_selected");
111
+ }
112
+ emitConnectionStringEntered(props) {
113
+ this.updateContext({
114
+ connection_string_provided: toBoolSet(props.provided),
115
+ connection_string_tested: toBoolSet(props.tested),
116
+ connection_test_attempts: props.attempts,
117
+ });
118
+ // If the user tested their connection string, surface the final
119
+ // test result on this step event (success/failure). If they skipped
120
+ // the test, the step itself still "succeeded" — the user chose not
121
+ // to validate — so we default to success.
122
+ this.emit("connection_string_entered", {}, props.testResult ?? "success");
123
+ }
124
+ emitServiceAccountIdEntered(provided) {
125
+ this.updateContext({ service_account_id_provided: toBoolSet(provided) });
126
+ this.emit("service_account_id_entered");
127
+ }
128
+ emitServiceAccountSecretEntered(provided) {
129
+ this.updateContext({ service_account_secret_provided: toBoolSet(provided) });
130
+ this.emit("service_account_secret_entered");
131
+ }
132
+ emitCredentialsValidated() {
133
+ this.emit("credentials_validated");
134
+ }
135
+ emitEditorConfigured(props) {
136
+ this.updateContext({
137
+ used_default_config_path: toBoolSet(props.usedDefaultConfigPath),
138
+ });
139
+ this.emit("editor_configured", props.error ? { error_type: errorName(props.error) } : {}, props.result);
140
+ }
141
+ emitSkillsInstallPrompted(outcome) {
142
+ const patch = { skills_install_status: outcome.status };
143
+ if (outcome.status === "skipped") {
144
+ patch.skills_skip_reason = outcome.reason;
145
+ }
146
+ else if (outcome.status === "failed") {
147
+ patch.skills_install_exit_code = outcome.exitCode;
148
+ }
149
+ this.updateContext(patch);
150
+ this.emit("skills_install_prompted");
151
+ }
152
+ emitOpenConfigPrompted(props) {
153
+ this.updateContext({ opened_config_file: toBoolSet(props.opened) });
154
+ this.emit("open_config_prompted", props.error ? { error_type: errorName(props.error) } : {}, props.result);
155
+ }
156
+ emitCompleted() {
157
+ this.emit("completed", { total_duration_ms: Date.now() - this.startedAt });
158
+ }
159
+ /**
160
+ * Emits a cancellation event (e.g. the user hit Ctrl+C). The `result` is
161
+ * "success" because the cancellation itself was handled gracefully — the
162
+ * distinct `stage: "cancelled"` is what analytics use to separate
163
+ * abandoned runs from completed ones.
164
+ */
165
+ emitCancelled() {
166
+ this.emit("cancelled", {
167
+ last_stage: this.lastStep,
168
+ total_duration_ms: Date.now() - this.startedAt,
169
+ });
170
+ }
171
+ emitFailed(error) {
172
+ this.emit("failed", {
173
+ last_stage: this.lastStep,
174
+ error_type: errorName(error),
175
+ total_duration_ms: Date.now() - this.startedAt,
176
+ }, "failure");
177
+ }
178
+ /**
179
+ * Best-effort flush of any buffered events before the process exits. Also
180
+ * closes the owned {@link DeviceId}.
181
+ */
182
+ async flush() {
183
+ try {
184
+ await this.telemetry.close();
185
+ }
186
+ catch {
187
+ // Ignore errors from telemetry.close()
188
+ }
189
+ finally {
190
+ try {
191
+ this.deviceId.close();
192
+ }
193
+ catch {
194
+ // Ignore errors - it's best-effort
195
+ }
196
+ }
197
+ }
198
+ }
199
+ const errorName = (error) => {
200
+ if (error && typeof error === "object" && "name" in error && typeof error.name === "string") {
201
+ return error.name;
202
+ }
203
+ return "unknown";
204
+ };
205
+ //# sourceMappingURL=setupTelemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupTelemetry.js","sourceRoot":"","sources":["../src/setupTelemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Config interface used by the setup wizard.
3
+ */
4
+ export interface SetupConfig {
5
+ apiBaseUrl: string;
6
+ telemetry: "enabled" | "disabled";
7
+ connectionString?: string;
8
+ transport: "stdio" | "http";
9
+ httpHost: string;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CACpB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@mongodb-js/mcp-setup",
3
+ "version": "3.0.0-prerelease.1",
4
+ "type": "module",
5
+ "description": "Setup wizard and configuration for MongoDB MCP server",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "default": "./dist/index.js"
10
+ }
11
+ },
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc --build tsconfig.build.json",
19
+ "test": "vitest --run",
20
+ "check": "tsc --build tsconfig.build.json --noEmit"
21
+ },
22
+ "dependencies": {
23
+ "@inquirer/prompts": "^8.0.2",
24
+ "@inquirer/select": "^5.1.3",
25
+ "@mongodb-js/mcp-atlas-api-client": "workspace:*",
26
+ "@mongodb-js/mcp-fetch": "workspace:*",
27
+ "@mongodb-js/mcp-atlas-telemetry": "workspace:*",
28
+ "@mongodb-js/mcp-core": "workspace:*",
29
+ "@mongodb-js/mcp-tools-atlas-local": "workspace:*",
30
+ "@mongodb-js/mcp-tools-mongodb": "workspace:*",
31
+ "@mongosh/service-provider-node-driver": "^5.0.2",
32
+ "chalk": "^5.6.2",
33
+ "jsonc-parser": "^3.3.1",
34
+ "mongodb-redact": "^1.4.6",
35
+ "semver": "^7.7.4"
36
+ },
37
+ "devDependencies": {
38
+ "@mongodb-js/mcp-types": "workspace:*",
39
+ "@mongodb-js/mcp-cli": "workspace:*",
40
+ "@types/node": "^25.6.0",
41
+ "@types/semver": "^7.7.0",
42
+ "typescript": "^5.9.2",
43
+ "vitest": "^4.1.5"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ }
48
+ }