From 06a42d33c2f0186883798aa2d8bf5ba379e2b21c Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Tue, 26 Aug 2025 17:49:34 +0200 Subject: [PATCH 1/3] wire up the actual mcp server in the mcp controller --- package-lock.json | 94 +++++++- package.json | 7 +- src/commands/index.ts | 1 + src/connectionController.ts | 31 +-- .../activeConnectionCodeLensProvider.ts | 5 +- src/editors/memoryFileSystemProvider.ts | 2 +- src/editors/playgroundController.ts | 5 +- src/explorer/explorerController.ts | 5 +- src/explorer/explorerTreeController.ts | 5 +- src/mcp/mcpController.ts | 201 +++++++++++++++--- src/mdbExtensionController.ts | 13 +- src/test/suite/connectionController.test.ts | 27 +-- 12 files changed, 312 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed98763c0..30ca5fa6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "mongodb-connection-string-url": "^3.0.2", "mongodb-data-service": "^22.30.1", "mongodb-log-writer": "^2.4.1", + "mongodb-mcp-server": "file:../atlas-mcp-server", "mongodb-query-parser": "^4.4.2", "mongodb-schema": "^12.6.2", "node-machine-id": "1.1.12", @@ -65,7 +66,7 @@ "@types/lodash": "^4.17.14", "@types/micromatch": "^4.0.9", "@types/mocha": "^8.2.3", - "@types/node": "^14.18.63", + "@types/node": "^20.19.0", "@types/prettier": "^2.7.3", "@types/react": "^17.0.83", "@types/react-dom": "^17.0.25", @@ -128,6 +129,77 @@ "vscode": "^1.101.1" } }, + "../atlas-mcp-server": { + "name": "mongodb-mcp-server", + "version": "0.2.0", + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.15.0", + "@mongodb-js/device-id": "^0.3.1", + "@mongodb-js/devtools-connect": "^3.9.2", + "@mongodb-js/devtools-proxy-support": "^0.5.1", + "@mongosh/arg-parser": "^3.14.0", + "@mongosh/service-provider-node-driver": "^3.10.2", + "@vitest/eslint-plugin": "^1.3.4", + "bson": "^6.10.4", + "express": "^5.1.0", + "lru-cache": "^11.1.0", + "mongodb": "^6.17.0", + "mongodb-connection-string-url": "^3.0.2", + "mongodb-log-writer": "^2.4.1", + "mongodb-redact": "^1.1.8", + "mongodb-schema": "^12.6.2", + "node-fetch": "^3.3.2", + "node-machine-id": "1.1.12", + "oauth4webapi": "^3.6.0", + "openapi-fetch": "^0.14.0", + "yargs-parser": "^22.0.0", + "zod": "^3.25.76" + }, + "bin": { + "mongodb-mcp-server": "dist/esm/index.js" + }, + "devDependencies": { + "@ai-sdk/azure": "^1.3.24", + "@ai-sdk/google": "^1.2.22", + "@ai-sdk/openai": "^1.3.23", + "@eslint/js": "^9.30.1", + "@modelcontextprotocol/inspector": "^0.16.0", + "@mongodb-js/oidc-mock-provider": "^0.11.3", + "@redocly/cli": "^1.34.4", + "@types/express": "^5.0.1", + "@types/http-proxy": "^1.17.16", + "@types/node": "^24.0.12", + "@types/proper-lockfile": "^4.1.4", + "@types/semver": "^7.7.0", + "@types/simple-oauth2": "^5.0.7", + "@types/yargs-parser": "^21.0.3", + "@vitest/coverage-v8": "^3.2.4", + "ai": "^4.3.17", + "duplexpair": "^1.0.2", + "eslint": "^9.30.1", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-prettier": "^5.5.1", + "globals": "^16.3.0", + "mongodb-runner": "^5.9.2", + "ollama-ai-provider": "^1.2.0", + "openapi-types": "^12.1.3", + "openapi-typescript": "^7.8.0", + "prettier": "^3.6.2", + "proper-lockfile": "^4.1.2", + "semver": "^7.7.2", + "simple-git": "^3.28.0", + "tsx": "^4.20.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.36.0", + "uuid": "^11.1.0", + "vitest": "^3.2.4", + "yaml": "^2.8.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >= 23.0.0" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -10254,9 +10326,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + "version": "20.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", + "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } }, "node_modules/@types/node-fetch": { "version": "2.6.11", @@ -10268,6 +10344,12 @@ "form-data": "^4.0.0" } }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -20895,6 +20977,10 @@ "bson": "6.x" } }, + "node_modules/mongodb-mcp-server": { + "resolved": "../atlas-mcp-server", + "link": true + }, "node_modules/mongodb-ns": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-2.4.2.tgz", diff --git a/package.json b/package.json index 454ad16a2..03ffa736c 100644 --- a/package.json +++ b/package.json @@ -529,6 +529,10 @@ { "command": "mdb.stopMCPServer", "title": "MongoDB: Stop MCP Server" + }, + { + "command": "mdb.getMCPServerConfig", + "title": "MongoDB: Get MCP Server Config" } ], "menus": { @@ -1414,6 +1418,7 @@ "mongodb-connection-string-url": "^3.0.2", "mongodb-data-service": "^22.30.1", "mongodb-log-writer": "^2.4.1", + "mongodb-mcp-server": "file:../atlas-mcp-server", "mongodb-query-parser": "^4.4.2", "mongodb-schema": "^12.6.2", "node-machine-id": "1.1.12", @@ -1445,7 +1450,7 @@ "@types/lodash": "^4.17.14", "@types/micromatch": "^4.0.9", "@types/mocha": "^8.2.3", - "@types/node": "^14.18.63", + "@types/node": "^20.19.0", "@types/prettier": "^2.7.3", "@types/react": "^17.0.83", "@types/react-dom": "^17.0.25", diff --git a/src/commands/index.ts b/src/commands/index.ts index ba826ac01..6d0439853 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -88,6 +88,7 @@ enum EXTENSION_COMMANDS { // MCP Server commands. START_MCP_SERVER = 'mdb.startMCPServer', STOP_MCP_SERVER = 'mdb.stopMCPServer', + GET_MCP_SERVER_CONFIG = 'mdb.getMCPServerConfig', } export type ExtensionCommand = EXTENSION_COMMANDS; diff --git a/src/connectionController.ts b/src/connectionController.ts index e103ae516..b3ac8314c 100644 --- a/src/connectionController.ts +++ b/src/connectionController.ts @@ -39,9 +39,9 @@ const log = createLogger('connection controller'); const MAX_CONNECTION_NAME_LENGTH = 512; -export enum DataServiceEventTypes { - CONNECTIONS_DID_CHANGE = 'CONNECTIONS_DID_CHANGE', - ACTIVE_CONNECTION_CHANGED = 'ACTIVE_CONNECTION_CHANGED', +interface DataServiceEventTypes { + CONNECTIONS_DID_CHANGE: any; + ACTIVE_CONNECTION_CHANGED: any; } export enum ConnectionTypes { @@ -156,7 +156,8 @@ export default class ConnectionController { private _statusView: StatusView; // Used by other parts of the extension that respond to changes in the connections. - private eventEmitter: EventEmitter = new EventEmitter(); + private eventEmitter: EventEmitter = + new EventEmitter(); constructor({ statusView, @@ -231,7 +232,7 @@ export default class ConnectionController { } if (loadedConnections.length) { - this.eventEmitter.emit(DataServiceEventTypes.CONNECTIONS_DID_CHANGE); + this.eventEmitter.emit('CONNECTIONS_DID_CHANGE'); } // TODO: re-enable with fewer 'Saved Connections Loaded' events @@ -439,7 +440,7 @@ export default class ConnectionController { }); this._connectionAttempt = connectionAttempt; this._connectingConnectionId = connectionId; - this.eventEmitter.emit(DataServiceEventTypes.CONNECTIONS_DID_CHANGE); + this.eventEmitter.emit('CONNECTIONS_DID_CHANGE'); if (this._activeDataService) { log.info('Disconnecting from the previous connection...', { @@ -531,7 +532,7 @@ export default class ConnectionController { this._connectingConnectionId = null; } - this.eventEmitter.emit(DataServiceEventTypes.CONNECTIONS_DID_CHANGE); + this.eventEmitter.emit('CONNECTIONS_DID_CHANGE'); } log.info('Successfully connected', { connectionId }); @@ -547,7 +548,7 @@ export default class ConnectionController { this._connectingConnectionId = null; this._connections[connectionId].lastUsed = new Date(); - this.eventEmitter.emit(DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED); + this.eventEmitter.emit('ACTIVE_CONNECTION_CHANGED'); await this._connectionStorage.saveConnection( this._connections[connectionId], ); @@ -721,8 +722,8 @@ export default class ConnectionController { this._disconnecting = true; this._statusView.showMessage('Disconnecting from current connection...'); - this.eventEmitter.emit(DataServiceEventTypes.CONNECTIONS_DID_CHANGE); - this.eventEmitter.emit(DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED); + this.eventEmitter.emit('CONNECTIONS_DID_CHANGE'); + this.eventEmitter.emit('ACTIVE_CONNECTION_CHANGED'); if (!this._activeDataService) { log.error('Unable to disconnect: no active connection'); @@ -766,7 +767,7 @@ export default class ConnectionController { delete this._connections[connectionId]; await this._connectionStorage.removeConnection(connectionId); - this.eventEmitter.emit(DataServiceEventTypes.CONNECTIONS_DID_CHANGE); + this.eventEmitter.emit('CONNECTIONS_DID_CHANGE'); } // Prompts the user to remove the connection then removes it on affirmation. @@ -957,8 +958,8 @@ export default class ConnectionController { } this._connections[connectionId].name = inputtedConnectionName; - this.eventEmitter.emit(DataServiceEventTypes.CONNECTIONS_DID_CHANGE); - this.eventEmitter.emit(DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED); + this.eventEmitter.emit('CONNECTIONS_DID_CHANGE'); + this.eventEmitter.emit('ACTIVE_CONNECTION_CHANGED'); await this._connectionStorage.saveConnection( this._connections[connectionId], @@ -969,14 +970,14 @@ export default class ConnectionController { } addEventListener( - eventType: DataServiceEventTypes, + eventType: keyof DataServiceEventTypes, listener: () => void, ): void { this.eventEmitter.addListener(eventType, listener); } removeEventListener( - eventType: DataServiceEventTypes, + eventType: keyof DataServiceEventTypes, listener: () => void, ): void { this.eventEmitter.removeListener(eventType, listener); diff --git a/src/editors/activeConnectionCodeLensProvider.ts b/src/editors/activeConnectionCodeLensProvider.ts index 5a99af594..f22c5db15 100644 --- a/src/editors/activeConnectionCodeLensProvider.ts +++ b/src/editors/activeConnectionCodeLensProvider.ts @@ -4,7 +4,6 @@ import EXTENSION_COMMANDS from '../commands'; import type ConnectionController from '../connectionController'; import { isPlayground } from '../utils/playground'; import { getDBFromConnectionString } from '../utils/connection-string-db'; -import { DataServiceEventTypes } from '../connectionController'; export default class ActiveConnectionCodeLensProvider implements vscode.CodeLensProvider @@ -28,7 +27,7 @@ export default class ActiveConnectionCodeLensProvider this._onDidChangeCodeLenses.fire(); }; this._connectionController.addEventListener( - DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED, + 'ACTIVE_CONNECTION_CHANGED', this._activeConnectionChangedHandler, ); } @@ -67,7 +66,7 @@ export default class ActiveConnectionCodeLensProvider deactivate(): void { this._connectionController.removeEventListener( - DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED, + 'ACTIVE_CONNECTION_CHANGED', this._activeConnectionChangedHandler, ); } diff --git a/src/editors/memoryFileSystemProvider.ts b/src/editors/memoryFileSystemProvider.ts index 1f44457fc..b9ae00403 100644 --- a/src/editors/memoryFileSystemProvider.ts +++ b/src/editors/memoryFileSystemProvider.ts @@ -219,7 +219,7 @@ export class MemoryFileSystemProvider implements vscode.FileSystemProvider { _emitter = new vscode.EventEmitter(); _bufferedEvents: vscode.FileChangeEvent[] = []; - _fireSoonHandle?: NodeJS.Timer; + _fireSoonHandle?: NodeJS.Timeout; readonly onDidChangeFile: vscode.Event = this._emitter.event; diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 643934280..e83dc743d 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -5,7 +5,6 @@ import os from 'os'; import type PlaygroundSelectionCodeActionProvider from './playgroundSelectionCodeActionProvider'; import type ConnectionController from '../connectionController'; -import { DataServiceEventTypes } from '../connectionController'; import { createLogger } from '../logging'; import type { ConnectionTreeItem } from '../explorer'; import { CollectionTreeItem } from '../explorer'; @@ -103,7 +102,7 @@ export default class PlaygroundController { void this._activeConnectionChanged(); }; this._connectionController.addEventListener( - DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED, + 'ACTIVE_CONNECTION_CHANGED', this._activeConnectionChangedHandler, ); @@ -684,7 +683,7 @@ export default class PlaygroundController { deactivate(): void { this._connectionController.removeEventListener( - DataServiceEventTypes.ACTIVE_CONNECTION_CHANGED, + 'ACTIVE_CONNECTION_CHANGED', this._activeConnectionChangedHandler, ); } diff --git a/src/explorer/explorerController.ts b/src/explorer/explorerController.ts index ca4f659b3..f29154d92 100644 --- a/src/explorer/explorerController.ts +++ b/src/explorer/explorerController.ts @@ -1,7 +1,6 @@ import type * as vscode from 'vscode'; import type ConnectionController from '../connectionController'; -import { DataServiceEventTypes } from '../connectionController'; import ExplorerTreeController from './explorerTreeController'; import { createTrackedTreeView } from '../utils/treeViewHelper'; import type { TelemetryService } from '../telemetry'; @@ -23,7 +22,7 @@ export default class ExplorerController { private createTreeView = (): void => { // Remove the listener that called this function. this._connectionController.removeEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', this.createTreeView, ); @@ -41,7 +40,7 @@ export default class ExplorerController { // Listen for a change in connections to occur before we create the tree // so that we show the `viewsWelcome` before any connections are added. this._connectionController.addEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', this.createTreeView, ); } diff --git a/src/explorer/explorerTreeController.ts b/src/explorer/explorerTreeController.ts index 387e1eede..135e9a923 100644 --- a/src/explorer/explorerTreeController.ts +++ b/src/explorer/explorerTreeController.ts @@ -1,7 +1,6 @@ import * as vscode from 'vscode'; import type ConnectionController from '../connectionController'; -import { DataServiceEventTypes } from '../connectionController'; import ConnectionTreeItem from './connectionTreeItem'; import { createLogger } from '../logging'; import { DOCUMENT_ITEM } from './documentTreeItem'; @@ -31,7 +30,7 @@ export default class ExplorerTreeController // Subscribe to changes in the connections. this._connectionController.addEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', () => { this.refresh(); }, @@ -42,7 +41,7 @@ export default class ExplorerTreeController removeListeners(): void { this._connectionController.removeEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', () => { this.refresh(); }, diff --git a/src/mcp/mcpController.ts b/src/mcp/mcpController.ts index 447cca4b7..a4f70d771 100644 --- a/src/mcp/mcpController.ts +++ b/src/mcp/mcpController.ts @@ -1,35 +1,27 @@ import * as vscode from 'vscode'; +import { defaultUserConfig, StreamableHttpRunner } from 'mongodb-mcp-server'; +import type ConnectionController from '../connectionController'; +// import * as os from 'os'; +// import * as path from 'path'; -type ServerInfo = { - headers: { [key: string]: string }; - port: number; - host: string; - protocol: 'http' | 'https'; -}; +type mcpServerStartupConfig = 'ask' | 'enabled' | 'disabled'; export class MCPController { private didChangeEmitter = new vscode.EventEmitter(); - private server: ServerInfo | undefined; + private server?: { + runner: StreamableHttpRunner; + headers: Record; + }; - constructor(private readonly context: vscode.ExtensionContext) { + constructor( + private readonly context: vscode.ExtensionContext, + private readonly connectionController: ConnectionController, + ) { this.context.subscriptions.push( vscode.lm.registerMcpServerDefinitionProvider('mongodb', { onDidChangeMcpServerDefinitions: this.didChangeEmitter.event, provideMcpServerDefinitions: () => { - const servers: vscode.McpServerDefinition[] = []; - if (this.server) { - servers.push( - new vscode.McpHttpServerDefinition( - 'MongoDB MCP Server', - vscode.Uri.parse( - `${this.server.protocol}://${this.server.host}:${this.server.port}`, - ), - this.server.headers, - ), - ); - } - - return servers; + return [this.getServerConfig()].filter((d) => d !== undefined); }, resolveMcpServerDefinition: (server: vscode.McpServerDefinition) => { return server; @@ -38,22 +30,165 @@ export class MCPController { ); } - public startServer(): Promise { - // Simulate starting a server and setting the server info. + public activate(): Promise { + this.connectionController.addEventListener( + 'ACTIVE_CONNECTION_CHANGED', + () => { + void this.onActiveConnectionChanged(); + }, + ); + + return Promise.resolve(); + } + + public async startServer(): Promise { + const headers: Record = { + authorization: `Bearer ${crypto.randomUUID()}`, + }; + const runner = new StreamableHttpRunner({ + ...defaultUserConfig, + httpPort: 0, + httpHeaders: headers, + disabledTools: ['connect'], + }); + + await runner.start(); + this.server = { - headers: { Authorization: 'Bearer 123' }, - port: 3000, - host: 'localhost', - protocol: 'http', + runner, + headers, }; this.didChangeEmitter.fire(); - - return Promise.resolve(); } - public stopServer(): Promise { - this.server = undefined; + public async stopServer(): Promise { + await this.server?.runner.close(); this.didChangeEmitter.fire(); - return Promise.resolve(); + } + + public async openServerConfig(): Promise { + const config = this.getServerConfig(); + if (!config) { + void vscode.window.showErrorMessage( + 'MongoDB MCP Server is not running. Start the server by running "MDB: Start MCP Server" in the command palette.', + ); + return false; + } + + try { + // Does not create a physical file, it only creates a URI from specified component parts. + // An untitled file URI: untitled:/extensionPath/mongodb-mcp-config.json + const documentUri = vscode.Uri.from({ + path: 'mongodb-mcp-config.json', + scheme: 'untitled', + }); + + // Fill in the content + const jsonConfig = JSON.stringify( + { + mcpServers: { + [config.label]: { + url: config.uri.toString(), + headers: config.headers, + }, + }, + }, + null, + 2, + ); + + const edit = new vscode.WorkspaceEdit(); + edit.insert( + documentUri, + new vscode.Position(0, 0), + `// Example config - refer to your IDE's docs for exact configuration details +// Note that the server generates a new authorization header and port every +// time it restarts, so this config will change if vscode or the MCP server +// is restarted. +${jsonConfig}`, + ); + await vscode.workspace.applyEdit(edit); + + // Actually show the editor. + // We open playgrounds by URI to use the secondary `mongodb` extension + // as an identifier that distinguishes them from regular JS files. + const document = await vscode.workspace.openTextDocument(documentUri); + await vscode.languages.setTextDocumentLanguage(document, 'json'); + await vscode.window.showTextDocument(document); + return true; + } catch (error) { + void vscode.window.showErrorMessage( + `Unable to create a config document: ${error}`, + ); + return false; + } + } + + private getServerConfig(): vscode.McpHttpServerDefinition | undefined { + if (!this.server) { + return undefined; + } + + return new vscode.McpHttpServerDefinition( + 'MongoDB MCP Server', + vscode.Uri.parse(`${this.server.runner.address}/mcp`), + this.server.headers, + ); + } + + private async onActiveConnectionChanged(): Promise { + if (this.server) { + // Server is created - update the connection information + // this.server.runner.updateConnection(); + return; + } + + if (!this.connectionController.getActiveConnectionId()) { + // No connection, don't prompt the user + return; + } + + const serverStartConfig = vscode.workspace + .getConfiguration('mdb') + .get('mcp.server'); + + let shouldStartServer = false; + switch (serverStartConfig) { + case 'enabled': + shouldStartServer = true; + break; + case 'disabled': + break; + default: + const prompt = await vscode.window.showInformationMessage( + 'Do you want to start the MongoDB MCP server automatically when connected to MongoDB?', + 'Yes', + 'No', + ); + + switch (prompt) { + case 'Yes': + shouldStartServer = true; + break; + case 'No': + shouldStartServer = false; + break; + default: + // User canceled/dismissed the notification - don't do anything. + return; + } + + await vscode.workspace + .getConfiguration('mdb') + .update( + 'mcp.server', + shouldStartServer ? 'enabled' : 'disabled', + true, + ); + } + + if (shouldStartServer) { + await this.startServer(); + } } } diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index fa9340b90..329935105 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -167,7 +167,10 @@ export default class MDBExtensionController implements vscode.Disposable { telemetryService: this._telemetryService, }); this._editorsController.registerProviders(); - this._mcpController = new MCPController(context); + this._mcpController = new MCPController( + context, + this._connectionController, + ); } subscribeToConfigurationChanges(): void { @@ -188,6 +191,7 @@ export default class MDBExtensionController implements vscode.Disposable { await this._connectionController.loadSavedConnections(); await this._languageServerController.startLanguageServer(); + await this._mcpController.activate(); this.registerCommands(); this.showOverviewPageIfRecentlyInstalled(); @@ -946,6 +950,13 @@ export default class MDBExtensionController implements vscode.Disposable { return true; }, ); + + this.registerCommand( + EXTENSION_COMMANDS.GET_MCP_SERVER_CONFIG, + (): Promise => { + return this._mcpController.openServerConfig(); + }, + ); } registerAtlasStreamsTreeViewCommands(): void { diff --git a/src/test/suite/connectionController.test.ts b/src/test/suite/connectionController.test.ts index e81219846..8a443fef2 100644 --- a/src/test/suite/connectionController.test.ts +++ b/src/test/suite/connectionController.test.ts @@ -9,7 +9,6 @@ import ConnectionString from 'mongodb-connection-string-url'; import ConnectionController, { ConnectionTypes, - DataServiceEventTypes, getNotifyDeviceFlowForConnectionAttempt, } from '../../connectionController'; import formatError from '../../utils/formatError'; @@ -499,19 +498,16 @@ suite('Connection Controller Test Suite', function () { const expectedTimesToFire = 2; let connectionsDidChangeEventFiredCount = 0; - testConnectionController.addEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, - () => { - connectionsDidChangeEventFiredCount++; - }, - ); + testConnectionController.addEventListener('CONNECTIONS_DID_CHANGE', () => { + connectionsDidChangeEventFiredCount++; + }); await testConnectionController.addNewConnectionStringAndConnect({ connectionString: TEST_DATABASE_URI, }); testConnectionController.removeEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', () => {}, ); @@ -526,12 +522,9 @@ suite('Connection Controller Test Suite', function () { const expectedTimesToFire = 3; let connectionsDidChangeEventFiredCount = 0; - testConnectionController.addEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, - () => { - connectionsDidChangeEventFiredCount++; - }, - ); + testConnectionController.addEventListener('CONNECTIONS_DID_CHANGE', () => { + connectionsDidChangeEventFiredCount++; + }); await testConnectionController.addNewConnectionStringAndConnect({ connectionString: TEST_DATABASE_URI, @@ -539,7 +532,7 @@ suite('Connection Controller Test Suite', function () { await testConnectionController.disconnect(); testConnectionController.removeEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', () => {}, ); @@ -1343,7 +1336,7 @@ suite('Connection Controller Test Suite', function () { let isConnectionChanged = false; testConnectionController.addEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', () => { isConnectionChanged = true; }, @@ -1352,7 +1345,7 @@ suite('Connection Controller Test Suite', function () { await testConnectionController.loadSavedConnections(); testConnectionController.removeEventListener( - DataServiceEventTypes.CONNECTIONS_DID_CHANGE, + 'CONNECTIONS_DID_CHANGE', () => {}, ); From 8628e0809ff0ba2596e7f89db7c47e124183ef59 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 29 Aug 2025 11:55:30 +0200 Subject: [PATCH 2/3] wire up logging --- src/logging.ts | 42 ++++++---------------- src/mcp/mcpController.ts | 43 +++++++++++++++++------ syntaxes/mongodbInjection.tmLanguage.json | 9 +++++ 3 files changed, 53 insertions(+), 41 deletions(-) diff --git a/src/logging.ts b/src/logging.ts index be3295862..37ac5a30c 100644 --- a/src/logging.ts +++ b/src/logging.ts @@ -15,53 +15,33 @@ class Logger implements ILogger { this.name = name; } + private formatMessage(message?: any, ...optionalParams: any[]): string { + return `[${this.name}] ${message} ${optionalParams.length ? util.inspect(optionalParams) : ''}`; + } + public trace(message?: any, ...optionalParams: any[]): void { - this.append( - 'TRACE', - `${message} ${optionalParams ? util.inspect(optionalParams) : ''}`, - ); + Logger.channel.trace(this.formatMessage(message, ...optionalParams)); } public debug(message?: any, ...optionalParams: any[]): void { - this.append( - 'DEBUG', - `${message} ${optionalParams ? util.inspect(optionalParams) : ''}`, - ); + Logger.channel.debug(this.formatMessage(message, ...optionalParams)); } public info(message?: any, ...optionalParams: any[]): void { - this.append( - 'INFO ', - `${message} ${optionalParams ? util.inspect(optionalParams) : ''}`, - ); + Logger.channel.info(this.formatMessage(message, ...optionalParams)); } public warn(message?: any, ...optionalParams: any[]): void { - this.append( - 'WARN ', - `${message} ${optionalParams ? util.inspect(optionalParams) : ''}`, - ); + Logger.channel.warn(this.formatMessage(message, ...optionalParams)); } public error(message?: any, ...optionalParams: any[]): void { - this.append( - 'ERROR', - `${message} ${optionalParams ? util.inspect(optionalParams) : ''}`, - ); + Logger.channel.error(this.formatMessage(message, ...optionalParams)); } public fatal(message?: any, ...optionalParams: any[]): void { - this.append( - 'FATAL', - `${message} ${optionalParams ? util.inspect(optionalParams) : ''}`, - ); - } - - private append(type: string, message: string): void { - // https://code.visualstudio.com/api/references/vscode-api#window.createOutputChannel - - Logger.channel.appendLine( - `${new Date().toISOString()} ${this.name} ${type} ${message}\n`, + Logger.channel.error( + `FATAL: ${this.formatMessage(message, ...optionalParams)}`, ); } } diff --git a/src/mcp/mcpController.ts b/src/mcp/mcpController.ts index a4f70d771..558c41c8c 100644 --- a/src/mcp/mcpController.ts +++ b/src/mcp/mcpController.ts @@ -1,11 +1,28 @@ import * as vscode from 'vscode'; -import { defaultUserConfig, StreamableHttpRunner } from 'mongodb-mcp-server'; +import type { LoggerType, LogLevel, LogPayload } from 'mongodb-mcp-server'; +import { + defaultUserConfig, + LoggerBase, + StreamableHttpRunner, +} from 'mongodb-mcp-server'; import type ConnectionController from '../connectionController'; -// import * as os from 'os'; -// import * as path from 'path'; +import { createLogger } from '../logging'; type mcpServerStartupConfig = 'ask' | 'enabled' | 'disabled'; +class VSCodeMCPLogger extends LoggerBase { + private readonly _logger = createLogger('mcp-server'); + protected type: LoggerType = 'console'; + protected logCore(level: LogLevel, payload: LogPayload): void { + const logMethod = this.mapToMongoDBLogLevel(level); + + this._logger[logMethod]( + `${payload.id.__value} - ${payload.context}: ${payload.message}`, + ...(payload.attributes ? [payload.attributes] : []), + ); + } +} + export class MCPController { private didChangeEmitter = new vscode.EventEmitter(); private server?: { @@ -45,12 +62,17 @@ export class MCPController { const headers: Record = { authorization: `Bearer ${crypto.randomUUID()}`, }; - const runner = new StreamableHttpRunner({ - ...defaultUserConfig, - httpPort: 0, - httpHeaders: headers, - disabledTools: ['connect'], - }); + const runner = new StreamableHttpRunner( + { + ...defaultUserConfig, + httpPort: 0, + httpHeaders: headers, + disabledTools: ['connect'], + loggers: ['mcp'], + }, + {}, + [new VSCodeMCPLogger()], + ); await runner.start(); @@ -63,6 +85,7 @@ export class MCPController { public async stopServer(): Promise { await this.server?.runner.close(); + this.server = undefined; this.didChangeEmitter.fire(); } @@ -131,7 +154,7 @@ ${jsonConfig}`, return new vscode.McpHttpServerDefinition( 'MongoDB MCP Server', - vscode.Uri.parse(`${this.server.runner.address}/mcp`), + vscode.Uri.parse(`${this.server.runner.serverAddress}/mcp`), this.server.headers, ); } diff --git a/syntaxes/mongodbInjection.tmLanguage.json b/syntaxes/mongodbInjection.tmLanguage.json index 8d2add5c7..0921df896 100644 --- a/syntaxes/mongodbInjection.tmLanguage.json +++ b/syntaxes/mongodbInjection.tmLanguage.json @@ -1917,6 +1917,15 @@ } } }, + { + "name": "meta.object.member.mongodb", + "match": "\\$rankFusion\\b", + "captures": { + "0": { + "name": "keyword.other.$rankFusion.mongodb" + } + } + }, { "name": "meta.object.member.mongodb", "match": "\\$redact\\b", From be8de945a66c99eeb4da5a0d23373d5055aa5918 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 29 Aug 2025 11:56:55 +0200 Subject: [PATCH 3/3] use released mcp server --- package-lock.json | 636 +++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 460 insertions(+), 178 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30ca5fa6e..19c96d7b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "mongodb-connection-string-url": "^3.0.2", "mongodb-data-service": "^22.30.1", "mongodb-log-writer": "^2.4.1", - "mongodb-mcp-server": "file:../atlas-mcp-server", + "mongodb-mcp-server": "^0.3.0", "mongodb-query-parser": "^4.4.2", "mongodb-schema": "^12.6.2", "node-machine-id": "1.1.12", @@ -129,82 +129,10 @@ "vscode": "^1.101.1" } }, - "../atlas-mcp-server": { - "name": "mongodb-mcp-server", - "version": "0.2.0", - "license": "Apache-2.0", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.15.0", - "@mongodb-js/device-id": "^0.3.1", - "@mongodb-js/devtools-connect": "^3.9.2", - "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongosh/arg-parser": "^3.14.0", - "@mongosh/service-provider-node-driver": "^3.10.2", - "@vitest/eslint-plugin": "^1.3.4", - "bson": "^6.10.4", - "express": "^5.1.0", - "lru-cache": "^11.1.0", - "mongodb": "^6.17.0", - "mongodb-connection-string-url": "^3.0.2", - "mongodb-log-writer": "^2.4.1", - "mongodb-redact": "^1.1.8", - "mongodb-schema": "^12.6.2", - "node-fetch": "^3.3.2", - "node-machine-id": "1.1.12", - "oauth4webapi": "^3.6.0", - "openapi-fetch": "^0.14.0", - "yargs-parser": "^22.0.0", - "zod": "^3.25.76" - }, - "bin": { - "mongodb-mcp-server": "dist/esm/index.js" - }, - "devDependencies": { - "@ai-sdk/azure": "^1.3.24", - "@ai-sdk/google": "^1.2.22", - "@ai-sdk/openai": "^1.3.23", - "@eslint/js": "^9.30.1", - "@modelcontextprotocol/inspector": "^0.16.0", - "@mongodb-js/oidc-mock-provider": "^0.11.3", - "@redocly/cli": "^1.34.4", - "@types/express": "^5.0.1", - "@types/http-proxy": "^1.17.16", - "@types/node": "^24.0.12", - "@types/proper-lockfile": "^4.1.4", - "@types/semver": "^7.7.0", - "@types/simple-oauth2": "^5.0.7", - "@types/yargs-parser": "^21.0.3", - "@vitest/coverage-v8": "^3.2.4", - "ai": "^4.3.17", - "duplexpair": "^1.0.2", - "eslint": "^9.30.1", - "eslint-config-prettier": "^10.1.5", - "eslint-plugin-prettier": "^5.5.1", - "globals": "^16.3.0", - "mongodb-runner": "^5.9.2", - "ollama-ai-provider": "^1.2.0", - "openapi-types": "^12.1.3", - "openapi-typescript": "^7.8.0", - "prettier": "^3.6.2", - "proper-lockfile": "^4.1.2", - "semver": "^7.7.2", - "simple-git": "^3.28.0", - "tsx": "^4.20.3", - "typescript": "^5.8.3", - "typescript-eslint": "^8.36.0", - "uuid": "^11.1.0", - "vitest": "^3.2.4", - "yaml": "^2.8.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >= 23.0.0" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5607,16 +5535,19 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -5625,7 +5556,6 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -5634,7 +5564,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -5656,14 +5585,12 @@ "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -5678,7 +5605,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -5690,7 +5616,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -5702,7 +5627,6 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -5765,7 +5689,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -5779,7 +5702,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -5792,8 +5714,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "deprecated": "Use @eslint/object-schema instead" }, "node_modules/@ibm-cloud/watsonx-ai": { "version": "1.4.0", @@ -7339,6 +7260,29 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.4.tgz", + "integrity": "sha512-zq24hfuAmmlNZvik0FLI58uE5sriN0WWsQzIlYnzSuKDAHFqJtBFrl/LfB1NLgJT5Y7dEBzaX4yAKqOPrcetaw==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@mongodb-js/compass-app-registry": { "version": "9.4.19", "resolved": "https://registry.npmjs.org/@mongodb-js/compass-app-registry/-/compass-app-registry-9.4.19.tgz", @@ -8830,7 +8774,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -8843,7 +8786,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -8852,7 +8794,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -10607,6 +10548,40 @@ } } }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", + "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.41.0", + "@typescript-eslint/types": "^8.41.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", + "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", @@ -10624,6 +10599,22 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", + "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/type-utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", @@ -10737,8 +10728,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vercel/functions": { "version": "1.6.0", @@ -10758,6 +10748,162 @@ } } }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.4.tgz", + "integrity": "sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.24.1" + }, + "peerDependencies": { + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", + "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", + "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", + "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.41.0", + "@typescript-eslint/tsconfig-utils": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", + "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", + "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitest/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@vscode/test-electron": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", @@ -11498,7 +11644,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -11602,7 +11747,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12293,7 +12437,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13694,8 +13837,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/console-browserify": { "version": "1.2.0", @@ -13789,7 +13931,6 @@ "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, "license": "MIT", "dependencies": { "object-assign": "^4", @@ -14334,8 +14475,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -14672,7 +14812,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -15399,7 +15538,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -16042,7 +16180,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -16053,14 +16190,12 @@ "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -16076,7 +16211,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -16092,7 +16226,6 @@ "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -16107,7 +16240,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -16119,7 +16251,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -16134,7 +16265,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -16149,7 +16279,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -16164,7 +16293,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -16176,7 +16304,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -16205,7 +16332,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -16217,7 +16343,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -16280,11 +16405,22 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/eventsource-parser": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=20.0.0" @@ -16450,6 +16586,21 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -16545,20 +16696,19 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -16568,7 +16718,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -16579,14 +16728,12 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-uri": { "version": "3.0.6", @@ -16640,7 +16787,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -16706,7 +16852,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -16813,7 +16958,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -16825,8 +16969,7 @@ "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/fn.name": { "version": "1.1.0", @@ -17184,8 +17327,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -17508,7 +17650,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17528,7 +17669,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -17755,8 +17895,7 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/gray-matter": { "version": "4.0.3", @@ -18342,7 +18481,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -18392,7 +18530,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -18411,7 +18548,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -18859,7 +18995,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18877,7 +19012,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -18980,7 +19114,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -19378,14 +19511,12 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -19817,7 +19948,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -20335,7 +20465,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -20459,7 +20588,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -20978,8 +21106,143 @@ } }, "node_modules/mongodb-mcp-server": { - "resolved": "../atlas-mcp-server", - "link": true + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mongodb-mcp-server/-/mongodb-mcp-server-0.3.0.tgz", + "integrity": "sha512-jcJsqmbBfWSgpXE8dR+T+9WCQwigBo7OcFoYJGswm7ja7CCHqBaExOumwNsD2MRqhMcO9t3igNr9Y4kgLohmQg==", + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.15.0", + "@mongodb-js/device-id": "^0.3.1", + "@mongodb-js/devtools-connect": "^3.9.2", + "@mongodb-js/devtools-proxy-support": "^0.5.1", + "@mongosh/arg-parser": "^3.14.0", + "@mongosh/service-provider-node-driver": "^3.10.2", + "@vitest/eslint-plugin": "^1.3.4", + "bson": "^6.10.4", + "express": "^5.1.0", + "lru-cache": "^11.1.0", + "mongodb": "^6.17.0", + "mongodb-connection-string-url": "^3.0.2", + "mongodb-log-writer": "^2.4.1", + "mongodb-redact": "^1.1.8", + "mongodb-schema": "^12.6.2", + "node-fetch": "^3.3.2", + "node-machine-id": "1.1.12", + "oauth4webapi": "^3.6.0", + "openapi-fetch": "^0.14.0", + "yargs-parser": "^22.0.0", + "zod": "^3.25.76" + }, + "bin": { + "mongodb-mcp-server": "dist/esm/index.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >= 23.0.0" + }, + "optionalDependencies": { + "kerberos": "^2.2.2" + } + }, + "node_modules/mongodb-mcp-server/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/mongodb-mcp-server/node_modules/kerberos": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-2.2.2.tgz", + "integrity": "sha512-42O7+/1Zatsc3MkxaMPpXcIl/ukIrbQaGoArZEAr6GcEi2qhfprOBYOPhj+YvSMJkEkdpTjApUx+2DuWaKwRhg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.2" + }, + "engines": { + "node": ">=12.9.0" + } + }, + "node_modules/mongodb-mcp-server/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/mongodb-mcp-server/node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT", + "optional": true + }, + "node_modules/mongodb-mcp-server/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "license": "MIT", + "optional": true + }, + "node_modules/mongodb-mcp-server/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/mongodb-mcp-server/node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb-mcp-server/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } }, "node_modules/mongodb-ns": { "version": "2.4.2", @@ -22126,8 +22389,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/natural-compare-lite": { "version": "1.4.0", @@ -22987,6 +23249,15 @@ "undici-types": "~5.26.4" } }, + "node_modules/openapi-fetch": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.14.0.tgz", + "integrity": "sha512-PshIdm1NgdLvb05zp8LqRQMNSKzIlPkyMxYFxwyHR+UlKD4t2nUjkDhNxeRbhRSEd3x5EUNh2w5sJYwkhOH4fg==", + "license": "MIT", + "dependencies": { + "openapi-typescript-helpers": "^0.0.15" + } + }, "node_modules/openapi-types": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", @@ -22994,6 +23265,12 @@ "dev": true, "license": "MIT" }, + "node_modules/openapi-typescript-helpers": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", + "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", + "license": "MIT" + }, "node_modules/openapi3-ts": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.5.0.tgz", @@ -23043,7 +23320,6 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -23419,7 +23695,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -23428,7 +23703,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23623,6 +23897,15 @@ "node": ">=0.10.0" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -23768,7 +24051,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -24000,7 +24282,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -24646,7 +24927,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -24671,7 +24951,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -24765,7 +25044,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -25953,7 +26231,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -26022,7 +26299,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -26576,8 +26852,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/through": { "version": "2.3.8", @@ -26788,6 +27063,18 @@ "node": ">= 14.0.0" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -26991,7 +27278,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -27255,7 +27541,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -28409,7 +28694,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -28421,7 +28705,6 @@ "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -28431,7 +28714,6 @@ "version": "3.24.1", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", - "dev": true, "license": "ISC", "peerDependencies": { "zod": "^3.24.1" diff --git a/package.json b/package.json index 03ffa736c..afacf16a6 100644 --- a/package.json +++ b/package.json @@ -1418,7 +1418,7 @@ "mongodb-connection-string-url": "^3.0.2", "mongodb-data-service": "^22.30.1", "mongodb-log-writer": "^2.4.1", - "mongodb-mcp-server": "file:../atlas-mcp-server", + "mongodb-mcp-server": "^0.3.0", "mongodb-query-parser": "^4.4.2", "mongodb-schema": "^12.6.2", "node-machine-id": "1.1.12",