Skip to content

Commit 4f7b769

Browse files
committed
mcp: persist extension server caches when they don't register
1 parent da6b5c3 commit 4f7b769

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

src/vs/workbench/contrib/mcp/common/discovery/extensionMcpDiscovery.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,13 @@ interface IServerCacheEntry {
2525

2626
const _mcpExtensionPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint(mcpContributionPoint);
2727

28+
const enum PersistWhen {
29+
CollectionExists,
30+
Always,
31+
}
32+
2833
export class ExtensionMcpDiscovery extends Disposable implements IMcpDiscovery {
29-
private readonly _extensionCollectionIdsToPersist = new Set<string>();
34+
private readonly _extensionCollectionIdsToPersist = new Map<string, PersistWhen>();
3035
private readonly cachedServers: { [collcetionId: string]: IServerCacheEntry };
3136

3237
constructor(
@@ -39,13 +44,17 @@ export class ExtensionMcpDiscovery extends Disposable implements IMcpDiscovery {
3944

4045
this._register(storageService.onWillSaveState(() => {
4146
let updated = false;
42-
for (const collectionId of this._extensionCollectionIdsToPersist) {
47+
for (const [collectionId, behavior] of this._extensionCollectionIdsToPersist.entries()) {
4348
const collection = this._mcpRegistry.collections.get().find(c => c.id === collectionId);
49+
let defs = collection?.serverDefinitions.get();
4450
if (!collection || collection.lazy) {
45-
continue;
51+
if (behavior === PersistWhen.Always) {
52+
defs = [];
53+
} else {
54+
continue;
55+
}
4656
}
4757

48-
const defs = collection.serverDefinitions.get();
4958
if (defs) {
5059
updated = true;
5160
this.cachedServers[collectionId] = { servers: defs.map(McpServerDefinition.toSerialized) };
@@ -77,7 +86,7 @@ export class ExtensionMcpDiscovery extends Disposable implements IMcpDiscovery {
7786

7887
for (const coll of collections.value) {
7988
const id = extensionPrefixedIdentifier(collections.description.identifier, coll.id);
80-
this._extensionCollectionIdsToPersist.add(id);
89+
this._extensionCollectionIdsToPersist.set(id, PersistWhen.CollectionExists);
8190

8291
const serverDefs = this.cachedServers.hasOwnProperty(id) ? this.cachedServers[id].servers : undefined;
8392
const dispo = this._mcpRegistry.registerCollection({
@@ -90,7 +99,10 @@ export class ExtensionMcpDiscovery extends Disposable implements IMcpDiscovery {
9099
serverDefinitions: observableValue<McpServerDefinition[]>(this, serverDefs?.map(McpServerDefinition.fromSerialized) || []),
91100
lazy: {
92101
isCached: !!serverDefs,
93-
load: () => this._activateExtensionServers(coll.id),
102+
load: () => this._activateExtensionServers(coll.id).then(() => {
103+
// persist (an empty collection) in case the extension doesn't end up publishing one
104+
this._extensionCollectionIdsToPersist.set(id, PersistWhen.Always);
105+
}),
94106
removed: () => extensionCollections.deleteAndDispose(id),
95107
},
96108
source: collections.description.identifier

0 commit comments

Comments
 (0)