1
>
/*---------------------------------------------------------------------------------------------
mcpRegistry.ts
2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { assertNever } from '../../../../base/common/assert.js';
7
>
import { Codicon } from '../../../../base/common/codicons.js';
8
>
import { Emitter } from '../../../../base/common/event.js';
9
>
import { MarkdownString } from '../../../../base/common/htmlContent.js';
10
>
import { Iterable } from '../../../../base/common/iterator.js';
11
>
import { Lazy } from '../../../../base/common/lazy.js';
12
>
import { Disposable, DisposableStore, IDisposable } from '../../../../base/common/lifecycle.js';
13
>
import { derived, IObservable, observableValue, autorunSelfDisposable } from '../../../../base/common/observable.js';
14
>
import { isDefined } from '../../../../base/common/types.js';
15
>
import { URI } from '../../../../base/common/uri.js';
16
>
import { localize } from '../../../../nls.js';
17
>
import { ConfigurationTarget, IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
18
>
import { IDialogService } from '../../../../platform/dialogs/common/dialogs.js';
19
>
import { ExtensionIdentifier } from '../../../../platform/extensions/common/extensions.js';
20
>
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
21
>
import { ILabelService } from '../../../../platform/label/common/label.js';
22
>
import { ILogService } from '../../../../platform/log/common/log.js';
23
>
import { mcpAccessConfig, McpAccessValue } from '../../../../platform/mcp/common/mcpManagement.js';
24
>
import { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';
25
>
import { observableConfigValue } from '../../../../platform/observable/common/platformObservableUtils.js';
26
>
import { IQuickInputButton, IQuickInputService, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js';
27
>
import { StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js';
28
>
import { IWorkspaceFolderData } from '../../../../platform/workspace/common/workspace.js';
29
>
import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from '../../../../platform/workspace/common/workspaceTrust.js';
30
>
import { IConfigurationResolverService } from '../../../services/configurationResolver/common/configurationResolver.js';
31
>
import { ConfigurationResolverExpression, IResolvedValue } from '../../../services/configurationResolver/common/configurationResolverExpression.js';
32
>
import { AUX_WINDOW_GROUP, IEditorService } from '../../../services/editor/common/editorService.js';
33
>
import { IMcpDevModeDebugging } from './mcpDevMode.js';
34
>
import { McpRegistryInputStorage } from './mcpRegistryInputStorage.js';
35
>
import { IMcpHostDelegate, IMcpRegistry, IMcpResolveConnectionOptions } from './mcpRegistryTypes.js';
36
>
import { IMcpSandboxService } from './mcpSandboxService.js';
37
>
import { McpServerConnection } from './mcpServerConnection.js';
38
>
import { IMcpServerConnection, LazyCollectionState, McpCollectionDefinition, McpDefinitionReference, McpServerDefinition, McpServerLaunch, McpServerTrust, McpStartServerInteraction, UserInteractionRequiredError } from './mcpTypes.js';
39
>
40
>
const notTrustedNonce = '__vscode_not_trusted';
41
>
42
>
export class McpRegistry extends Disposable implements IMcpRegistry {
43
>
declare public readonly _serviceBrand: undefined;
44
>
45
>
private readonly _collections = observableValue<readonly McpCollectionDefinition[]>('collections', []);
46
>
private readonly _delegates = observableValue<readonly IMcpHostDelegate[]>('delegates', []);
47
>
private readonly _mcpAccessValue: IObservable<string>;
48
>
public readonly collections: IObservable<readonly McpCollectionDefinition[]> = derived(reader => {
49
if (this._mcpAccessValue.read(reader) === McpAccessValue.None) {
50
return [];
51
}
52
return this._collections.read(reader);
54
>
55
>
private readonly _workspaceStorage = new Lazy(() => this._register(this._instantiationService.createInstance(McpRegistryInputStorage, StorageScope.WORKSPACE, StorageTarget.USER)));
56
>
private readonly _profileStorage = new Lazy(() => this._register(this._instantiationService.createInstance(McpRegistryInputStorage, StorageScope.PROFILE, StorageTarget.USER)));
57
>
58
>
private readonly _ongoingLazyActivations = observableValue(this, 0);
59
>
60
>
public readonly lazyCollectionState = derived(reader => {
61
if (this._mcpAccessValue.read(reader) === McpAccessValue.None) {
62
return { state: LazyCollectionState.AllKnown, collections: [] };