Skip to content

Commit 3973aa0

Browse files
committed
Prevents older ide versions throwing errors due to McpProvider
1 parent f28ba46 commit 3973aa0

File tree

4 files changed

+26
-23
lines changed

4 files changed

+26
-23
lines changed

src/container.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,6 @@ export class Container {
274274
this._disposables.push(cliIntegration);
275275
}
276276

277-
const mcpProvider = getMcpProvider(this);
278-
if (mcpProvider != null) {
279-
this._disposables.push(mcpProvider);
280-
}
281-
282277
this._disposables.push(
283278
configuration.onDidChange(e => {
284279
if (configuration.changed(e, 'terminalLinks.enabled')) {
@@ -327,6 +322,7 @@ export class Container {
327322

328323
this._ready = true;
329324
await this.registerGitProviders();
325+
await this.registerMcpProvider();
330326
queueMicrotask(() => this._onReady.fire());
331327
}
332328

@@ -341,6 +337,14 @@ export class Container {
341337
void this._git.registrationComplete();
342338
}
343339

340+
@log()
341+
private async registerMcpProvider(): Promise<void> {
342+
const mcpProvider = await getMcpProvider(this);
343+
if (mcpProvider != null) {
344+
this._disposables.push(mcpProvider);
345+
}
346+
}
347+
344348
private onAnyConfigurationChanged(e: ConfigurationChangeEvent) {
345349
if (!configuration.changedAny(e, extensionPrefix)) return;
346350

src/env/node/gk/mcp/integration.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import type { Event, McpServerDefinition } from 'vscode';
2-
import { version as codeVersion, Disposable, env, EventEmitter, lm, McpStdioServerDefinition, window } from 'vscode';
2+
import { Disposable, env, EventEmitter, lm, McpStdioServerDefinition, window } from 'vscode';
33
import type { Container } from '../../../../container';
44
import type { StorageChangeEvent } from '../../../../system/-webview/storage';
55
import { getHostAppName } from '../../../../system/-webview/vscode';
66
import { debounce } from '../../../../system/function/debounce';
77
import { Logger } from '../../../../system/logger';
8-
import { satisfies } from '../../../../system/version';
98
import { run } from '../../git/shell';
109
import { getPlatform } from '../../platform';
1110
import { toMcpInstallProvider } from './utils';
@@ -15,25 +14,13 @@ const CLIProxyMCPConfigOutputs = {
1514
};
1615

1716
export class McpProvider implements Disposable {
18-
static #instance: McpProvider | undefined;
19-
20-
static create(container: Container): McpProvider | undefined {
21-
if (!satisfies(codeVersion, '>= 1.101.0') || !lm.registerMcpServerDefinitionProvider) return undefined;
22-
23-
if (this.#instance == null) {
24-
this.#instance = new McpProvider(container);
25-
}
26-
27-
return this.#instance;
28-
}
29-
3017
private readonly _disposable: Disposable;
3118
private readonly _onDidChangeMcpServerDefinitions = new EventEmitter<void>();
3219
get onDidChangeMcpServerDefinitions(): Event<void> {
3320
return this._onDidChangeMcpServerDefinitions.event;
3421
}
3522

36-
private constructor(private readonly container: Container) {
23+
constructor(private readonly container: Container) {
3724
this._disposable = Disposable.from(
3825
this.container.storage.onDidChange(e => this.checkStorage(e)),
3926
lm.registerMcpServerDefinitionProvider('gitlens.mcpProvider', {

src/env/node/providers.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Container } from '../../container';
22
import type { GitCommandOptions } from '../../git/commandOptions';
33
import type { GitProvider } from '../../git/gitProvider';
44
import type { RepositoryLocationProvider } from '../../git/location/repositorylocationProvider';
5+
import { supportsMcpRegistration } from '../../plus/gk/utils/-webview/mcp.utils';
56
import type { SharedGkStorageLocationProvider } from '../../plus/repos/sharedGkStorageLocationProvider';
67
import type { GkWorkspacesSharedStorageProvider } from '../../plus/workspaces/workspacesSharedStorageProvider';
78
import { configuration } from '../../system/-webview/configuration';
@@ -14,7 +15,7 @@ import { GkCliIntegrationProvider } from './gk/cli/integration';
1415
import { LocalRepositoryLocationProvider } from './gk/localRepositoryLocationProvider';
1516
import { LocalSharedGkStorageLocationProvider } from './gk/localSharedGkStorageLocationProvider';
1617
import { LocalGkWorkspacesSharedStorageProvider } from './gk/localWorkspacesSharedStorageProvider';
17-
import { McpProvider } from './gk/mcp/integration';
18+
import type { McpProvider } from './gk/mcp/integration';
1819

1920
let gitInstance: Git | undefined;
2021
function ensureGit(container: Container) {
@@ -73,6 +74,11 @@ export function getGkCliIntegrationProvider(container: Container): GkCliIntegrat
7374
return new GkCliIntegrationProvider(container);
7475
}
7576

76-
export function getMcpProvider(container: Container): McpProvider | undefined {
77-
return McpProvider.create(container);
77+
export async function getMcpProvider(container: Container): Promise<McpProvider | undefined> {
78+
if (!supportsMcpRegistration()) return undefined;
79+
80+
// Older versions of VS Code do not support the classes used in the MCP integration, so we need to dynamically import
81+
const mcpModule = await import(/* webpackChunkName: "mcp" */ './gk/mcp/integration');
82+
83+
return new mcpModule.McpProvider(container);
7884
}

src/plus/gk/utils/-webview/mcp.utils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import { lm, version } from 'vscode';
12
import { getPlatform, isWeb } from '@env/platform';
23
import type { Container } from '../../../../container';
34
import { getHostAppName } from '../../../../system/-webview/vscode';
5+
import { satisfies } from '../../../../system/version';
46

57
export async function isMcpBannerEnabled(container: Container): Promise<boolean> {
68
// Check if running on web
@@ -22,3 +24,7 @@ export async function isMcpBannerEnabled(container: Container): Promise<boolean>
2224

2325
return hostAppName != null && supportedApps.includes(hostAppName);
2426
}
27+
28+
export function supportsMcpRegistration(): boolean {
29+
return satisfies(version, '>= 1.101.0') && lm.registerMcpServerDefinitionProvider != null;
30+
}

0 commit comments

Comments
 (0)