// Copyright (c) Microsoft. All rights reserved. using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.AI; using Microsoft.Shared.Diagnostics; using ModelContextProtocol.Client; using ModelContextProtocol.Protocol; namespace Microsoft.Agents.AI.Mcp; /// /// Extension methods on that expose MCP server tools to a Microsoft /// Agent Framework agent with optional long-running task (SEP-2663) handling. /// public static class McpClientTaskExtensions { /// /// Lists tools advertised by the connected MCP server and returns each as an /// . Tools that declare /// are wrapped with task-aware behavior so an agent can transparently drive long-running /// invocations. All other tools — including those that declare /// — are returned as-is, preserving inline /// (synchronous) invocation semantics by default. /// /// The connected MCP client. /// /// Options that control the task lifecycle for task-capable tools. /// When , defaults described on apply. /// /// Token used to cancel listing the server's tools. /// The tools, ready to pass to AsAIAgent(tools: …). public static async Task> ListAgentToolsWithTaskSupportAsync( this McpClient client, McpTaskOptions? options = null, CancellationToken cancellationToken = default) { _ = Throw.IfNull(client); McpTaskOptions effectiveOptions = options ?? new McpTaskOptions(); IList tools = await client.ListToolsAsync(cancellationToken: cancellationToken).ConfigureAwait(false); AIFunction[] result = new AIFunction[tools.Count]; for (int i = 0; i < tools.Count; i++) { ToolTaskSupport? taskSupport = tools[i].ProtocolTool.Execution?.TaskSupport; if (taskSupport is ToolTaskSupport.Required) { result[i] = new TaskAwareMcpClientAIFunction(client, tools[i], effectiveOptions); } else { result[i] = tools[i]; } } return result; } }