Path: blob/main/src/vs/platform/mcp/common/mcpManagementCli.ts
3294 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { ILogger } from '../../log/common/log.js';6import { IMcpServerConfiguration, IMcpServerVariable } from './mcpPlatformTypes.js';7import { IMcpManagementService } from './mcpManagement.js';89type ValidatedConfig = { name: string; config: IMcpServerConfiguration; inputs?: IMcpServerVariable[] };1011export class McpManagementCli {12constructor(13private readonly _logger: ILogger,14@IMcpManagementService private readonly _mcpManagementService: IMcpManagementService,15) { }1617async addMcpDefinitions(18definitions: string[],19) {20const configs = definitions.map((config) => this.validateConfiguration(config));21await this.updateMcpInResource(configs);22this._logger.info(`Added MCP servers: ${configs.map(c => c.name).join(', ')}`);23}2425private async updateMcpInResource(configs: ValidatedConfig[]) {26await Promise.all(configs.map(({ name, config, inputs }) => this._mcpManagementService.install({ name, config, inputs })));27}2829private validateConfiguration(config: string): ValidatedConfig {30let parsed: IMcpServerConfiguration & { name: string; inputs?: IMcpServerVariable[] };31try {32parsed = JSON.parse(config);33} catch (e) {34throw new InvalidMcpOperationError(`Invalid JSON '${config}': ${e}`);35}3637if (!parsed.name) {38throw new InvalidMcpOperationError(`Missing name property in ${config}`);39}4041if (!('command' in parsed) && !('url' in parsed)) {42throw new InvalidMcpOperationError(`Missing command or URL property in ${config}`);43}4445const { name, inputs, ...rest } = parsed;46return { name, inputs, config: rest as IMcpServerConfiguration };47}48}4950class InvalidMcpOperationError extends Error {51constructor(message: string) {52super(message);53this.stack = message;54}55}565758