mcp: order extension host delegates to avoid unnecessary CORS errors (#245165)

Cherry-picks #245163
This commit is contained in:
Connor Peet
2025-03-31 12:07:22 -07:00
committed by GitHub
parent 81d9beacdf
commit 6228ee6375
6 changed files with 12 additions and 0 deletions
@@ -40,6 +40,8 @@ export class MainThreadMcp extends Disposable implements MainThreadMcpShape {
const proxy = _extHostContext.getProxy(ExtHostContext.ExtHostMcp);
this._mcpEnabled = observableConfigValue(mcpEnabledSection, true, configurationService);
this._register(this._mcpRegistry.registerDelegate({
// Prefer Node.js extension hosts when they're available. No CORS issues etc.
priority: _extHostContext.extensionHostKind === ExtensionHostKind.LocalWebWorker ? 0 : 1,
waitForInitialProviderPromises() {
return proxy.$waitForInitialCollectionProviders();
},
@@ -112,6 +112,8 @@ export class McpRegistry extends Disposable implements IMcpRegistry {
public registerDelegate(delegate: IMcpHostDelegate): IDisposable {
this._delegates.push(delegate);
this._delegates.sort((a, b) => b.priority - a.priority);
return {
dispose: () => {
const index = this._delegates.indexOf(delegate);
@@ -27,6 +27,8 @@ export interface IMcpMessageTransport extends IDisposable {
}
export interface IMcpHostDelegate {
/** Priority for this delegate, delegates are tested in descending priority order */
readonly priority: number;
waitForInitialProviderPromises(): Promise<void>;
canStart(collectionDefinition: McpCollectionDefinition, serverDefinition: McpServerDefinition): boolean;
start(collectionDefinition: McpCollectionDefinition, serverDefinition: McpServerDefinition, resolvedLaunch: McpServerLaunch): IMcpMessageTransport;
@@ -72,6 +72,8 @@ class TestConfigurationResolverService implements Partial<IConfigurationResolver
}
class TestMcpHostDelegate implements IMcpHostDelegate {
priority = 0;
canStart(): boolean {
return true;
}
@@ -26,6 +26,8 @@ class TestMcpHostDelegate extends Disposable implements IMcpHostDelegate {
private readonly _transport: TestMcpMessageTransport;
private _canStartValue = true;
priority = 0;
constructor() {
super();
this._transport = this._register(new TestMcpMessageTransport());
@@ -24,6 +24,8 @@ import { CancellationTokenSource } from '../../../../../base/common/cancellation
class TestMcpHostDelegate extends Disposable implements IMcpHostDelegate {
private readonly _transport: TestMcpMessageTransport;
priority = 0;
constructor() {
super();
this._transport = this._register(new TestMcpMessageTransport());