@@ -18,13 +18,13 @@ import { IInstantiationService } from '../../instantiation/common/instantiation.
18
18
import { ILogService } from '../../log/common/log.js' ;
19
19
import { IUriIdentityService } from '../../uriIdentity/common/uriIdentity.js' ;
20
20
import { IUserDataProfilesService } from '../../userDataProfile/common/userDataProfile.js' ;
21
- import { DidUninstallMcpServerEvent , IGalleryMcpServer , ILocalMcpServer , IMcpGalleryService , IMcpManagementService , IMcpServerInput , IMcpServerManifest , InstallMcpServerEvent , InstallMcpServerResult , PackageType , UninstallMcpServerEvent , IScannedMcpServer , InstallOptions , UninstallOptions , IInstallableMcpServer } from './mcpManagement.js' ;
22
- import { IMcpServerVariable , McpServerVariableType , IMcpServerConfiguration } from './mcpPlatformTypes.js' ;
21
+ import { DidUninstallMcpServerEvent , IGalleryMcpServer , ILocalMcpServer , IMcpGalleryService , IMcpManagementService , IMcpServerInput , IMcpServerManifest , InstallMcpServerEvent , InstallMcpServerResult , PackageType , UninstallMcpServerEvent , InstallOptions , UninstallOptions , IInstallableMcpServer } from './mcpManagement.js' ;
22
+ import { IMcpServerVariable , McpServerVariableType , IMcpServerConfiguration , McpServerType } from './mcpPlatformTypes.js' ;
23
23
import { IMcpResourceScannerService , McpResourceTarget } from './mcpResourceScannerService.js' ;
24
24
25
25
export interface ILocalMcpServerInfo {
26
26
name : string ;
27
- version : string ;
27
+ version ? : string ;
28
28
id ?: string ;
29
29
displayName ?: string ;
30
30
url ?: string ;
@@ -95,7 +95,7 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
95
95
const scannedMcpServers = await this . mcpResourceScannerService . scanMcpServers ( this . mcpResource , this . target ) ;
96
96
if ( scannedMcpServers . servers ) {
97
97
await Promise . allSettled ( Object . entries ( scannedMcpServers . servers ) . map ( async ( [ name , scannedServer ] ) => {
98
- const server = await this . scanServer ( scannedServer ) ;
98
+ const server = await this . scanLocalServer ( name , scannedServer ) ;
99
99
local . set ( name , server ) ;
100
100
} ) ) ;
101
101
}
@@ -115,7 +115,7 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
115
115
} ) ) ;
116
116
}
117
117
118
- private async updateLocal ( ) : Promise < void > {
118
+ protected async updateLocal ( ) : Promise < void > {
119
119
try {
120
120
const current = await this . populateLocalServer ( ) ;
121
121
@@ -163,20 +163,17 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
163
163
return Array . from ( this . local . values ( ) ) ;
164
164
}
165
165
166
- protected async scanServer ( scannedMcpServer : IScannedMcpServer ) : Promise < ILocalMcpServer > {
167
- let mcpServerInfo = await this . getLocalMcpServerInfo ( scannedMcpServer ) ;
166
+ protected async scanLocalServer ( name : string , config : IMcpServerConfiguration ) : Promise < ILocalMcpServer > {
167
+ let mcpServerInfo = await this . getLocalServerInfo ( name , config ) ;
168
168
if ( ! mcpServerInfo ) {
169
- mcpServerInfo = {
170
- name : scannedMcpServer . name ,
171
- version : '1.0.0' ,
172
- } ;
169
+ mcpServerInfo = { name, version : config . version } ;
173
170
}
174
171
175
172
return {
176
- name : scannedMcpServer . name ,
177
- config : scannedMcpServer . config ,
178
- version : mcpServerInfo . version ,
173
+ name,
174
+ config,
179
175
mcpResource : this . mcpResource ,
176
+ version : mcpServerInfo . version ,
180
177
location : mcpServerInfo . location ,
181
178
id : mcpServerInfo . id ,
182
179
displayName : mcpServerInfo . displayName ,
@@ -196,17 +193,12 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
196
193
197
194
this . _onInstallMcpServer . fire ( { name : server . name , mcpResource : this . mcpResource } ) ;
198
195
try {
199
- const scannedServer : IScannedMcpServer = {
200
- id : server . name ,
201
- name : server . name ,
202
- version : '0.0.1' ,
203
- config : server . config
204
- } ;
205
-
206
- await this . mcpResourceScannerService . addMcpServers ( [ { server : scannedServer , inputs : server . inputs } ] , this . mcpResource , this . target ) ;
207
-
208
- const local = await this . scanServer ( scannedServer ) ;
209
- this . reloadConfigurationScheduler . schedule ( ) ;
196
+ await this . mcpResourceScannerService . addMcpServers ( [ server ] , this . mcpResource , this . target ) ;
197
+ await this . updateLocal ( ) ;
198
+ const local = this . local . get ( server . name ) ;
199
+ if ( ! local ) {
200
+ throw new Error ( `Failed to install MCP server: ${ server . name } ` ) ;
201
+ }
210
202
return local ;
211
203
} catch ( e ) {
212
204
this . _onDidInstallMcpServers . fire ( [ { name : server . name , error : e , mcpResource : this . mcpResource } ] ) ;
@@ -227,7 +219,7 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
227
219
if ( server . location ) {
228
220
await this . fileService . del ( URI . revive ( server . location ) , { recursive : true } ) ;
229
221
}
230
- this . reloadConfigurationScheduler . schedule ( ) ;
222
+ await this . updateLocal ( ) ;
231
223
} catch ( e ) {
232
224
this . _onDidUninstallMcpServer . fire ( { name : server . name , error : e , mcpResource : this . mcpResource } ) ;
233
225
throw e ;
@@ -256,7 +248,7 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
256
248
}
257
249
}
258
250
config = {
259
- type : 'http' ,
251
+ type : McpServerType . REMOTE ,
260
252
url : manifest . remotes [ 0 ] . url ,
261
253
headers : Object . keys ( headers ) . length ? headers : undefined ,
262
254
} ;
@@ -352,7 +344,7 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
352
344
}
353
345
354
346
config = {
355
- type : 'stdio' ,
347
+ type : McpServerType . LOCAL ,
356
348
command : this . getCommandName ( serverPackage . registry_name ) ,
357
349
args : args . length ? args : undefined ,
358
350
env : Object . keys ( env ) . length ? env : undefined ,
@@ -390,7 +382,7 @@ export abstract class AbstractMcpResourceManagementService extends Disposable im
390
382
}
391
383
392
384
abstract installFromGallery ( server : IGalleryMcpServer , options ?: InstallOptions ) : Promise < ILocalMcpServer > ;
393
- protected abstract getLocalMcpServerInfo ( scannedMcpServer : IScannedMcpServer ) : Promise < ILocalMcpServerInfo | undefined > ;
385
+ protected abstract getLocalServerInfo ( name : string , mcpServerConfig : IMcpServerConfiguration ) : Promise < ILocalMcpServerInfo | undefined > ;
394
386
}
395
387
396
388
export class McpUserResourceManagementService extends AbstractMcpResourceManagementService implements IMcpManagementService {
@@ -440,30 +432,36 @@ export class McpUserResourceManagementService extends AbstractMcpResourceManagem
440
432
}
441
433
const { config, inputs } = this . toScannedMcpServerAndInputs ( manifest , options ?. packageType ) ;
442
434
443
- const scannedServer : IScannedMcpServer = {
444
- id : server . id ,
435
+ const installable : IInstallableMcpServer = {
445
436
name : server . name ,
446
- version : server . version ,
447
- gallery : true ,
448
- config
437
+ config : {
438
+ ...config ,
439
+ gallery : true ,
440
+ version : server . version
441
+ } ,
442
+ inputs
449
443
} ;
450
444
451
- await this . mcpResourceScannerService . addMcpServers ( [ { server : scannedServer , inputs } ] , this . mcpResource , this . target ) ;
445
+ await this . mcpResourceScannerService . addMcpServers ( [ installable ] , this . mcpResource , this . target ) ;
452
446
453
- const local = await this . scanServer ( scannedServer ) ;
447
+ await this . updateLocal ( ) ;
448
+ const local = ( await this . getInstalled ( ) ) . find ( s => s . name === server . name ) ;
449
+ if ( ! local ) {
450
+ throw new Error ( `Failed to install MCP server: ${ server . name } ` ) ;
451
+ }
454
452
return local ;
455
453
} catch ( e ) {
456
454
this . _onDidInstallMcpServers . fire ( [ { name : server . name , source : server , error : e , mcpResource : this . mcpResource } ] ) ;
457
455
throw e ;
458
456
}
459
457
}
460
458
461
- protected async getLocalMcpServerInfo ( scannedMcpServer : IScannedMcpServer ) : Promise < ILocalMcpServerInfo | undefined > {
459
+ protected async getLocalServerInfo ( name : string , mcpServerConfig : IMcpServerConfiguration ) : Promise < ILocalMcpServerInfo | undefined > {
462
460
let storedMcpServerInfo : ILocalMcpServerInfo | undefined ;
463
461
let location : URI | undefined ;
464
462
let readmeUrl : URI | undefined ;
465
- if ( scannedMcpServer . gallery ) {
466
- location = this . getLocation ( scannedMcpServer . name , scannedMcpServer . version ) ;
463
+ if ( mcpServerConfig . gallery ) {
464
+ location = this . getLocation ( name , mcpServerConfig . version ) ;
467
465
const manifestLocation = this . uriIdentityService . extUri . joinPath ( location , 'manifest.json' ) ;
468
466
try {
469
467
const content = await this . fileService . readFile ( manifestLocation ) ;
0 commit comments