@@ -17,10 +17,12 @@ import { equalsIgnoreCase } from '../../../../base/common/strings.js';
1717import { URI } from '../../../../base/common/uri.js' ;
1818import { createFileSystemProviderError , FileChangeType , FileSystemProviderCapabilities , FileSystemProviderErrorCode , FileType , IFileChange , IFileDeleteOptions , IFileOverwriteOptions , IFileReadStreamOptions , IFileService , IFileSystemProviderWithFileAtomicReadCapability , IFileSystemProviderWithFileReadStreamCapability , IFileSystemProviderWithFileReadWriteCapability , IFileWriteOptions , IStat , IWatchOptions } from '../../../../platform/files/common/files.js' ;
1919import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js' ;
20+ import { IWebContentExtractorService } from '../../../../platform/webContentExtractor/common/webContentExtractor.js' ;
2021import { IWorkbenchContribution } from '../../../common/contributions.js' ;
2122import { McpServer } from './mcpServer.js' ;
2223import { McpServerRequestHandler } from './mcpServerRequestHandler.js' ;
2324import { IMcpService , McpCapability , McpResourceURI } from './mcpTypes.js' ;
25+ import { canLoadMcpNetworkResourceDirectly } from './mcpTypesUtils.js' ;
2426import { MCP } from './modelContextProtocol.js' ;
2527
2628const MOMENTARY_CACHE_DURATION = 3000 ;
@@ -65,6 +67,7 @@ export class McpResourceFilesystem extends Disposable implements IWorkbenchContr
6567 constructor (
6668 @IInstantiationService private readonly _instantiationService : IInstantiationService ,
6769 @IFileService private readonly _fileService : IFileService ,
70+ @IWebContentExtractorService private readonly _webContentExtractorService : IWebContentExtractorService ,
6871 ) {
6972 super ( ) ;
7073 this . _register ( this . _fileService . registerProvider ( McpResourceURI . scheme , this ) ) ;
@@ -164,7 +167,6 @@ export class McpResourceFilesystem extends Disposable implements IWorkbenchContr
164167 if ( forSameURI . length > 0 ) {
165168 throw createFileSystemProviderError ( `File is not a directory` , FileSystemProviderErrorCode . FileNotADirectory ) ;
166169 }
167-
168170 const resourcePathParts = resourceURI . pathname . split ( '/' ) ;
169171
170172 const output = new Map < string , FileType > ( ) ;
@@ -273,12 +275,26 @@ export class McpResourceFilesystem extends Disposable implements IWorkbenchContr
273275
274276 private async _readURIInner ( uri : URI , token ?: CancellationToken ) : Promise < IReadData > {
275277 const { resourceURI, server } = this . _decodeURI ( uri ) ;
276- const res = await McpServer . callOn ( server , r => r . readResource ( { uri : resourceURI . toString ( ) } , token ) , token ) ;
278+ const matchedServer = this . _mcpService . servers . get ( ) . find ( s => s . definition . id === server . definition . id ) ;
279+
280+ //check for http/https resources and use web content extractor service to fetch the contents.
281+ if ( canLoadMcpNetworkResourceDirectly ( resourceURI , matchedServer ) ) {
282+ const extractURI = URI . parse ( resourceURI . toString ( ) ) ;
283+ const result = ( await this . _webContentExtractorService . extract ( [ extractURI ] , { followRedirects : false } ) ) . at ( 0 ) ;
284+ if ( result ?. status === 'ok' ) {
285+ return {
286+ contents : [ { uri : resourceURI . toString ( ) , text : result . result } ] ,
287+ resourceURI,
288+ forSameURI : [ { uri : resourceURI . toString ( ) , text : result . result } ]
289+ } ;
290+ }
291+ }
277292
293+ const res = await McpServer . callOn ( server , r => r . readResource ( { uri : resourceURI . toString ( ) } , token ) , token ) ;
278294 return {
279295 contents : res . contents ,
280296 resourceURI,
281- forSameURI : res . contents . filter ( c => equalsUrlPath ( c . uri , resourceURI ) ) ,
297+ forSameURI : res . contents . filter ( c => equalsUrlPath ( c . uri , resourceURI ) )
282298 } ;
283299 }
284300}
0 commit comments