diff --git a/.changeset/fix-register-tool-icons.md b/.changeset/fix-register-tool-icons.md new file mode 100644 index 000000000..30adf5c89 --- /dev/null +++ b/.changeset/fix-register-tool-icons.md @@ -0,0 +1,5 @@ +--- +'@modelcontextprotocol/server': patch +--- + +Support `icons` in `McpServer.registerTool()` config and include it in `tools/list` responses. The MCP spec's `ToolSchema` includes `icons` via `IconsSchema`, but the high-level API did not accept or serialize it. diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index 6c2699997..bd0a52fc8 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -146,6 +146,7 @@ export class McpServer { : EMPTY_OBJECT_JSON_SCHEMA, annotations: tool.annotations, execution: tool.execution, + icons: tool.icons, _meta: tool._meta }; @@ -773,7 +774,8 @@ export class McpServer { annotations: ToolAnnotations | undefined, execution: ToolExecution | undefined, _meta: Record | undefined, - handler: AnyToolHandler + handler: AnyToolHandler, + icons?: Tool['icons'], ): RegisteredTool { // Validate tool name according to SEP specification validateAndWarnToolName(name); @@ -788,6 +790,7 @@ export class McpServer { outputSchema, annotations, execution, + icons, _meta, handler: handler, executor: createToolExecutor(inputSchema, handler), @@ -870,6 +873,7 @@ export class McpServer { inputSchema?: InputArgs; outputSchema?: OutputArgs; annotations?: ToolAnnotations; + icons?: Tool['icons']; _meta?: Record; }, cb: ToolCallback @@ -878,7 +882,7 @@ export class McpServer { throw new Error(`Tool ${name} is already registered`); } - const { title, description, inputSchema, outputSchema, annotations, _meta } = config; + const { title, description, inputSchema, outputSchema, annotations, icons, _meta } = config; return this._createRegisteredTool( name, @@ -889,7 +893,8 @@ export class McpServer { annotations, { taskSupport: 'forbidden' }, _meta, - cb as ToolCallback + cb as ToolCallback, + icons, ); } @@ -1096,6 +1101,7 @@ export type RegisteredTool = { outputSchema?: StandardSchemaWithJSON; annotations?: ToolAnnotations; execution?: ToolExecution; + icons?: Tool['icons']; _meta?: Record; handler: AnyToolHandler; /** @hidden */