Skip to content

Commit c3a4ffb

Browse files
authored
mcp: update with icons added to resource templates (microsoft#269199)
Followup addition from modelcontextprotocol/modelcontextprotocol#1565
1 parent c2527c9 commit c3a4ffb

5 files changed

Lines changed: 17 additions & 9 deletions

File tree

src/vs/workbench/contrib/mcp/browser/mcpResourceQuickAccess.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,24 @@ export class McpResourcePickHelper {
3737
}
3838

3939
public static item(resource: IMcpResource | IMcpResourceTemplate): IQuickPickItem {
40+
const icon = resource.icons.getUrl(22);
41+
const iconPath = icon ? { dark: icon, light: icon } : undefined;
4042
if (isMcpResourceTemplate(resource)) {
4143
return {
4244
id: resource.template.template,
4345
label: resource.title || resource.name,
4446
description: resource.description,
4547
detail: localize('mcp.resource.template', 'Resource template: {0}', resource.template.template),
48+
iconPath,
4649
};
4750
}
4851

49-
const icon = resource.icons.getUrl(22);
5052
return {
5153
id: resource.uri.toString(),
5254
label: resource.title || resource.name,
5355
description: resource.description,
5456
detail: resource.mcpUri + (resource.sizeInBytes !== undefined ? ' (' + ByteSize.formatSize(resource.sizeInBytes) + ')' : ''),
55-
iconPath: icon ? { dark: icon, light: icon } : undefined,
57+
iconPath,
5658
};
5759
}
5860

src/vs/workbench/contrib/mcp/common/mcpIcons.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ interface IIcon {
2525
sizes: { width: number; height: number }[];
2626
}
2727

28+
export type ParsedMcpIcons = IIcon[];
2829
export type StoredMcpIcons = Dto<IIcon>[];
2930

3031

@@ -68,8 +69,8 @@ function validateIcon(icon: MCP.Icon, launch: McpServerLaunch, logger: ILogger):
6869
return;
6970
}
7071

71-
export function parseAndValidateMcpIcon(icons: MCP.Icons, launch: McpServerLaunch, logger: ILogger): StoredMcpIcons {
72-
const result: StoredMcpIcons = [];
72+
export function parseAndValidateMcpIcon(icons: MCP.Icons, launch: McpServerLaunch, logger: ILogger): ParsedMcpIcons {
73+
const result: ParsedMcpIcons = [];
7374
for (const icon of icons.icons || []) {
7475
const uri = validateIcon(icon, launch, logger);
7576
if (!uri) {
@@ -92,9 +93,12 @@ export function parseAndValidateMcpIcon(icons: MCP.Icons, launch: McpServerLaunc
9293
}
9394

9495
export class McpIcons implements IMcpIcons {
95-
9696
public static fromStored(icons: StoredMcpIcons | undefined) {
97-
return new McpIcons(icons?.map(i => ({ src: URI.revive(i.src), sizes: i.sizes })) || []);
97+
return McpIcons.fromParsed(icons?.map(i => ({ src: URI.revive(i.src), sizes: i.sizes })));
98+
}
99+
100+
public static fromParsed(icons: ParsedMcpIcons | undefined) {
101+
return new McpIcons(icons || []);
98102
}
99103

100104
protected constructor(private readonly _icons: IIcon[]) { }

src/vs/workbench/contrib/mcp/common/mcpServer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ export class McpServer extends Disposable implements IMcpServer {
489489
return new AsyncIterableProducer<IMcpResource[]>(async emitter => {
490490
await McpServer.callOn(this, async (handler) => {
491491
for await (const resource of handler.listResourcesIterable({}, cts.token)) {
492-
emitter.emitOne(resource.map(r => new McpResource(this, r, McpIcons.fromStored(this._parseIcons(r)))));
492+
emitter.emitOne(resource.map(r => new McpResource(this, r, McpIcons.fromParsed(this._parseIcons(r)))));
493493
if (cts.token.isCancellationRequested) {
494494
return;
495495
}
@@ -501,7 +501,7 @@ export class McpServer extends Disposable implements IMcpServer {
501501
public resourceTemplates(token?: CancellationToken): Promise<IMcpResourceTemplate[]> {
502502
return McpServer.callOn(this, async (handler) => {
503503
const templates = await handler.listResourceTemplates({}, token);
504-
return templates.map(t => new McpResourceTemplate(this, t));
504+
return templates.map(t => new McpResourceTemplate(this, t, McpIcons.fromParsed(this._parseIcons(t))));
505505
}, token);
506506
}
507507

@@ -1074,6 +1074,7 @@ class McpResourceTemplate implements IMcpResourceTemplate {
10741074
constructor(
10751075
private readonly _server: McpServer,
10761076
private readonly _definition: MCP.ResourceTemplate,
1077+
public readonly icons: IMcpIcons,
10771078
) {
10781079
this.name = _definition.name;
10791080
this.description = _definition.description;

src/vs/workbench/contrib/mcp/common/mcpTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ export interface IMcpResourceTemplate {
356356
readonly description?: string;
357357
readonly mimeType?: string;
358358
readonly template: UriTemplate;
359+
readonly icons: IMcpIcons;
359360

360361
/** Gets string completions for the given template part. */
361362
complete(templatePart: string, prefix: string, alreadyResolved: Record<string, string | string[]>, token: CancellationToken): Promise<string[]>;

src/vs/workbench/contrib/mcp/common/modelContextProtocol.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ export namespace MCP {/* JSON-RPC types */
635635
/**
636636
* A template description for resources available on the server.
637637
*/
638-
export interface ResourceTemplate extends BaseMetadata {
638+
export interface ResourceTemplate extends BaseMetadata, Icons {
639639
/**
640640
* A URI template (according to RFC 6570) that can be used to construct resource URIs.
641641
*

0 commit comments

Comments
 (0)