diff --git a/src/server/index.test.ts b/src/server/index.test.ts index 489d0b0de..b8bf60450 100644 --- a/src/server/index.test.ts +++ b/src/server/index.test.ts @@ -316,6 +316,44 @@ describe("registerAppTool schema forms", () => { }); }); +describe("registerAppTool icons", () => { + it("lists the tool's icons in tools/list", async () => { + const icons = [ + { + src: "https://example.com/weather-light.svg", + mimeType: "image/svg+xml", + sizes: ["any"], + theme: "light" as const, + }, + { + src: "https://example.com/weather-dark.svg", + mimeType: "image/svg+xml", + sizes: ["any"], + theme: "dark" as const, + }, + ]; + const server = new RealMcpServer({ name: "test", version: "0.0.0" }); + registerAppTool( + server, + "weather", + { + description: "Get weather forecast", + icons, + _meta: { ui: { resourceUri: "ui://weather/view.html" } }, + }, + async () => ({ content: [{ type: "text", text: "sunny" }] }), + ); + const client = new Client({ name: "client", version: "0.0.0" }); + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + await server.connect(serverTransport); + await client.connect(clientTransport); + + const { tools } = await client.listTools(); + expect(tools[0].icons).toEqual(icons); + }); +}); + describe("registerAppResource", () => { it("should register a resource with default MIME type", () => { let capturedName: string | undefined; diff --git a/src/server/index.ts b/src/server/index.ts index 5fad055a0..9e931dd17 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -41,6 +41,7 @@ import { RESOURCE_URI_META_KEY, RESOURCE_MIME_TYPE } from "../constants.js"; import type { CallToolResult, ClientCapabilities, + Icon, InputRequiredResult, McpServer, ReadResourceResult, @@ -103,6 +104,8 @@ export interface ToolConfig { inputSchema?: ZodRawShape | StandardSchemaWithJSON; outputSchema?: ZodRawShape | StandardSchemaWithJSON; annotations?: ToolAnnotations; + /** Icons a client can show for the tool, listed in `tools/list` as given. */ + icons?: Icon[]; _meta?: Record; }