@@ -7,17 +7,15 @@ import { CancellationToken } from '../../../base/common/cancellation.js';
7
7
import { MarkdownString } from '../../../base/common/htmlContent.js' ;
8
8
import { Disposable } from '../../../base/common/lifecycle.js' ;
9
9
import { Schemas } from '../../../base/common/network.js' ;
10
- import { dirname , joinPath } from '../../../base/common/resources.js' ;
11
- import { uppercaseFirstLetter } from '../../../base/common/strings.js' ;
12
- import { isString } from '../../../base/common/types.js' ;
10
+ import { format2 , uppercaseFirstLetter } from '../../../base/common/strings.js' ;
13
11
import { URI } from '../../../base/common/uri.js' ;
14
12
import { localize } from '../../../nls.js' ;
15
- import { IConfigurationService } from '../../configuration/common/configuration.js' ;
16
13
import { IFileService } from '../../files/common/files.js' ;
17
14
import { ILogService } from '../../log/common/log.js' ;
18
15
import { IProductService } from '../../product/common/productService.js' ;
19
16
import { asJson , asText , IRequestService } from '../../request/common/request.js' ;
20
- import { IGalleryMcpServer , IMcpGalleryService , IMcpServerManifest , IQueryOptions , mcpGalleryServiceUrlConfig , PackageType } from './mcpManagement.js' ;
17
+ import { IGalleryMcpServer , IMcpGalleryService , IMcpServerManifest , IQueryOptions , PackageType } from './mcpManagement.js' ;
18
+ import { IMcpGalleryManifestService , McpGalleryManifestStatus , getMcpGalleryManifestResourceUri , McpGalleryResourceType , IMcpGalleryManifest } from './mcpGalleryManifest.js' ;
21
19
22
20
interface IRawGalleryServersResult {
23
21
readonly servers : readonly IRawGalleryMcpServer [ ] ;
@@ -58,21 +56,26 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
58
56
_serviceBrand : undefined ;
59
57
60
58
constructor (
61
- @IConfigurationService private readonly configurationService : IConfigurationService ,
62
59
@IRequestService private readonly requestService : IRequestService ,
63
60
@IFileService private readonly fileService : IFileService ,
64
61
@IProductService private readonly productService : IProductService ,
65
62
@ILogService private readonly logService : ILogService ,
63
+ @IMcpGalleryManifestService private readonly mcpGalleryManifestService : IMcpGalleryManifestService ,
66
64
) {
67
65
super ( ) ;
68
66
}
69
67
70
68
isEnabled ( ) : boolean {
71
- return this . getMcpGalleryUrl ( ) !== undefined ;
69
+ return this . mcpGalleryManifestService . mcpGalleryManifestStatus === McpGalleryManifestStatus . Available ;
72
70
}
73
71
74
72
async query ( options ?: IQueryOptions , token : CancellationToken = CancellationToken . None ) : Promise < IGalleryMcpServer [ ] > {
75
- let { servers } = await this . fetchGallery ( token ) ;
73
+ const mcpGalleryManifest = await this . mcpGalleryManifestService . getMcpGalleryManifest ( ) ;
74
+ if ( ! mcpGalleryManifest ) {
75
+ return [ ] ;
76
+ }
77
+
78
+ let { servers } = await this . fetchGallery ( mcpGalleryManifest , token ) ;
76
79
77
80
if ( options ?. text ) {
78
81
const searchText = options . text . toLowerCase ( ) ;
@@ -81,21 +84,21 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
81
84
82
85
const galleryServers : IGalleryMcpServer [ ] = [ ] ;
83
86
for ( const item of servers ) {
84
- galleryServers . push ( this . toGalleryMcpServer ( item ) ) ;
87
+ galleryServers . push ( this . toGalleryMcpServer ( item , mcpGalleryManifest ) ) ;
85
88
}
86
89
87
90
return galleryServers ;
88
91
}
89
92
90
93
async getMcpServers ( names : string [ ] ) : Promise < IGalleryMcpServer [ ] > {
91
- const mcpUrl = this . getMcpGalleryUrl ( ) ?? this . productService . extensionsGallery ?. mcpUrl ;
92
- if ( ! mcpUrl ) {
94
+ const mcpGalleryManifest = await this . mcpGalleryManifestService . getMcpGalleryManifest ( ) ;
95
+ if ( ! mcpGalleryManifest ) {
93
96
return [ ] ;
94
97
}
95
98
96
- const { servers } = await this . fetchGallery ( mcpUrl , CancellationToken . None ) ;
99
+ const { servers } = await this . fetchGallery ( mcpGalleryManifest , CancellationToken . None ) ;
97
100
const filteredServers = servers . filter ( item => names . includes ( item . name ) ) ;
98
- return filteredServers . map ( item => this . toGalleryMcpServer ( item ) ) ;
101
+ return filteredServers . map ( item => this . toGalleryMcpServer ( item , mcpGalleryManifest ) ) ;
99
102
}
100
103
101
104
async getManifest ( gallery : IGalleryMcpServer , token : CancellationToken ) : Promise < IMcpServerManifest > {
@@ -167,7 +170,7 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
167
170
return result ;
168
171
}
169
172
170
- private toGalleryMcpServer ( item : IRawGalleryMcpServer ) : IGalleryMcpServer {
173
+ private toGalleryMcpServer ( item : IRawGalleryMcpServer , mcpGalleryManifest : IMcpGalleryManifest ) : IGalleryMcpServer {
171
174
let publisher = '' ;
172
175
const nameParts = item . name . split ( '/' ) ;
173
176
if ( nameParts . length > 0 ) {
@@ -178,7 +181,7 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
178
181
}
179
182
180
183
let icon : { light : string ; dark : string } | undefined ;
181
- const mcpGalleryUrl = this . getMcpGalleryUrl ( ) ;
184
+ const mcpGalleryUrl = this . getMcpGalleryUrl ( mcpGalleryManifest ) ;
182
185
if ( mcpGalleryUrl && this . productService . extensionsGallery ?. mcpUrl !== mcpGalleryUrl ) {
183
186
if ( item . iconUrl ) {
184
187
icon = {
@@ -206,7 +209,7 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
206
209
codicon : item . codicon ,
207
210
icon,
208
211
readmeUrl : item . readmeUrl ,
209
- manifestUrl : this . getManifestUrl ( item ) ,
212
+ manifestUrl : this . getManifestUrl ( item , mcpGalleryManifest ) ,
210
213
packageTypes : item . package_types ?? [ ] ,
211
214
publisher,
212
215
publisherDisplayName : item . publisher ?. displayName ,
@@ -218,15 +221,12 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
218
221
} ;
219
222
}
220
223
221
- private async fetchGallery ( token : CancellationToken ) : Promise < IRawGalleryServersResult > ;
222
- private async fetchGallery ( url : string , token : CancellationToken ) : Promise < IRawGalleryServersResult > ;
223
- private async fetchGallery ( arg1 : any , arg2 ?: any ) : Promise < IRawGalleryServersResult > {
224
- const mcpGalleryUrl = isString ( arg1 ) ? arg1 : this . getMcpGalleryUrl ( ) ;
224
+ private async fetchGallery ( mcpGalleryManifest : IMcpGalleryManifest , token : CancellationToken ) : Promise < IRawGalleryServersResult > {
225
+ const mcpGalleryUrl = this . getMcpGalleryUrl ( mcpGalleryManifest ) ;
225
226
if ( ! mcpGalleryUrl ) {
226
- return Promise . resolve ( { servers : [ ] } ) ;
227
+ return { servers : [ ] } ;
227
228
}
228
229
229
- const token = isString ( arg1 ) ? arg2 : arg1 ;
230
230
const uri = URI . parse ( mcpGalleryUrl ) ;
231
231
if ( uri . scheme === Schemas . file ) {
232
232
try {
@@ -247,26 +247,19 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
247
247
return result || { servers : [ ] } ;
248
248
}
249
249
250
- private getManifestUrl ( item : IRawGalleryMcpServer ) : string | undefined {
251
- const mcpGalleryUrl = this . getMcpGalleryUrl ( ) ;
252
-
253
- if ( ! mcpGalleryUrl ) {
250
+ private getManifestUrl ( item : IRawGalleryMcpServer , mcpGalleryManifest : IMcpGalleryManifest ) : string | undefined {
251
+ if ( ! item . id ) {
254
252
return undefined ;
255
253
}
256
-
257
- const uri = URI . parse ( mcpGalleryUrl ) ;
258
- if ( uri . scheme === Schemas . file ) {
259
- return joinPath ( dirname ( uri ) , item . id ?? item . name ) . fsPath ;
254
+ const resourceUriTemplate = getMcpGalleryManifestResourceUri ( mcpGalleryManifest , McpGalleryResourceType . McpServerManifestUri ) ;
255
+ if ( ! resourceUriTemplate ) {
256
+ return undefined ;
260
257
}
261
-
262
- return `${ mcpGalleryUrl } /${ item . id } ` ;
258
+ return format2 ( resourceUriTemplate , { id : item . id } ) ;
263
259
}
264
260
265
- private getMcpGalleryUrl ( ) : string | undefined {
266
- if ( this . productService . quality === 'stable' ) {
267
- return undefined ;
268
- }
269
- return this . configurationService . getValue < string > ( mcpGalleryServiceUrlConfig ) ;
261
+ private getMcpGalleryUrl ( mcpGalleryManifest : IMcpGalleryManifest ) : string | undefined {
262
+ return getMcpGalleryManifestResourceUri ( mcpGalleryManifest , McpGalleryResourceType . McpQueryService ) ;
270
263
}
271
264
272
265
}
0 commit comments