@@ -7,17 +7,15 @@ import { CancellationToken } from '../../../base/common/cancellation.js';
77import { MarkdownString } from '../../../base/common/htmlContent.js' ;
88import { Disposable } from '../../../base/common/lifecycle.js' ;
99import { 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' ;
1311import { URI } from '../../../base/common/uri.js' ;
1412import { localize } from '../../../nls.js' ;
15- import { IConfigurationService } from '../../configuration/common/configuration.js' ;
1613import { IFileService } from '../../files/common/files.js' ;
1714import { ILogService } from '../../log/common/log.js' ;
1815import { IProductService } from '../../product/common/productService.js' ;
1916import { 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' ;
2119
2220interface IRawGalleryServersResult {
2321 readonly servers : readonly IRawGalleryMcpServer [ ] ;
@@ -58,21 +56,26 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
5856 _serviceBrand : undefined ;
5957
6058 constructor (
61- @IConfigurationService private readonly configurationService : IConfigurationService ,
6259 @IRequestService private readonly requestService : IRequestService ,
6360 @IFileService private readonly fileService : IFileService ,
6461 @IProductService private readonly productService : IProductService ,
6562 @ILogService private readonly logService : ILogService ,
63+ @IMcpGalleryManifestService private readonly mcpGalleryManifestService : IMcpGalleryManifestService ,
6664 ) {
6765 super ( ) ;
6866 }
6967
7068 isEnabled ( ) : boolean {
71- return this . getMcpGalleryUrl ( ) !== undefined ;
69+ return this . mcpGalleryManifestService . mcpGalleryManifestStatus === McpGalleryManifestStatus . Available ;
7270 }
7371
7472 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 ) ;
7679
7780 if ( options ?. text ) {
7881 const searchText = options . text . toLowerCase ( ) ;
@@ -81,21 +84,21 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
8184
8285 const galleryServers : IGalleryMcpServer [ ] = [ ] ;
8386 for ( const item of servers ) {
84- galleryServers . push ( this . toGalleryMcpServer ( item ) ) ;
87+ galleryServers . push ( this . toGalleryMcpServer ( item , mcpGalleryManifest ) ) ;
8588 }
8689
8790 return galleryServers ;
8891 }
8992
9093 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 ) {
9396 return [ ] ;
9497 }
9598
96- const { servers } = await this . fetchGallery ( mcpUrl , CancellationToken . None ) ;
99+ const { servers } = await this . fetchGallery ( mcpGalleryManifest , CancellationToken . None ) ;
97100 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 ) ) ;
99102 }
100103
101104 async getManifest ( gallery : IGalleryMcpServer , token : CancellationToken ) : Promise < IMcpServerManifest > {
@@ -167,7 +170,7 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
167170 return result ;
168171 }
169172
170- private toGalleryMcpServer ( item : IRawGalleryMcpServer ) : IGalleryMcpServer {
173+ private toGalleryMcpServer ( item : IRawGalleryMcpServer , mcpGalleryManifest : IMcpGalleryManifest ) : IGalleryMcpServer {
171174 let publisher = '' ;
172175 const nameParts = item . name . split ( '/' ) ;
173176 if ( nameParts . length > 0 ) {
@@ -178,7 +181,7 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
178181 }
179182
180183 let icon : { light : string ; dark : string } | undefined ;
181- const mcpGalleryUrl = this . getMcpGalleryUrl ( ) ;
184+ const mcpGalleryUrl = this . getMcpGalleryUrl ( mcpGalleryManifest ) ;
182185 if ( mcpGalleryUrl && this . productService . extensionsGallery ?. mcpUrl !== mcpGalleryUrl ) {
183186 if ( item . iconUrl ) {
184187 icon = {
@@ -206,7 +209,7 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
206209 codicon : item . codicon ,
207210 icon,
208211 readmeUrl : item . readmeUrl ,
209- manifestUrl : this . getManifestUrl ( item ) ,
212+ manifestUrl : this . getManifestUrl ( item , mcpGalleryManifest ) ,
210213 packageTypes : item . package_types ?? [ ] ,
211214 publisher,
212215 publisherDisplayName : item . publisher ?. displayName ,
@@ -218,15 +221,12 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
218221 } ;
219222 }
220223
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 ) ;
225226 if ( ! mcpGalleryUrl ) {
226- return Promise . resolve ( { servers : [ ] } ) ;
227+ return { servers : [ ] } ;
227228 }
228229
229- const token = isString ( arg1 ) ? arg2 : arg1 ;
230230 const uri = URI . parse ( mcpGalleryUrl ) ;
231231 if ( uri . scheme === Schemas . file ) {
232232 try {
@@ -247,26 +247,19 @@ export class McpGalleryService extends Disposable implements IMcpGalleryService
247247 return result || { servers : [ ] } ;
248248 }
249249
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 ) {
254252 return undefined ;
255253 }
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 ;
260257 }
261-
262- return `${ mcpGalleryUrl } /${ item . id } ` ;
258+ return format2 ( resourceUriTemplate , { id : item . id } ) ;
263259 }
264260
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 ) ;
270263 }
271264
272265}
0 commit comments