C#实现MCP Client 与 LLM 连接,抓取网页内容功能!

tools) {     // 如果消息历史为空,则初始化系统提示消息     if (Messages.Count == 0)     {         Messages =          [             new(ChatRole.System, “您是一位乐于助人的助手,帮助我们测试MCP服务器功能,优先使用中文回答!”)         ];     }     // 添加用户输入的消息到对话历史     Messages.Add(new(ChatRole.User, query));     // 设置请求选项,注入可用工具     var options = new ChatOptions     {         Tools = [.. tools]     };     // 调用 AI 客户端获取响应     var response = await ChatClient.GetResponseAsync(Messages, options);     // 将 AI 响应加入对话历史     Messages.AddMessages(response);     // 输出调用的工具信息     OutputToolUsageInfo(response);     // 返回模型生成的文本响应     return response.Text; }

## 2.3 MCP 工具使用情况日志
* * *
在**ChatAIClient文件,添加如下代码,输出 AI 调用MCP 工具的情况。**
```csharp
 /// <summary>
    /// 辅助方法:输出 AI 在响应中调用的工具信息到控制台。
    /// </summary>
    /// <param name="response"/>来自 AI 的完整响应对象
    private void OutputToolUsageInfo(ChatResponse response)
    {
        // 获取所有 Tool 角色的消息
        var toolUseMessages = response.Messages.Where(m =&gt; m.Role == ChatRole.Tool).ToList();
        // 判断是否调用了工具
        // 获取响应中所有角色为 Tool 的消息(即 AI 调用了哪些工具)
        var toolUseMessage = response.Messages.Where(m =&gt; m.Role == ChatRole.Tool);
        // 判断第一条消息的内容是否多于一个(通常第一个消息是用户问题,第二个是调用函数)
        if (response.Messages[0].Contents.Count &gt; 1)
        {
            // 尝试从第一条消息的第二个内容项提取出函数调用信息
            var functionCall = (FunctionCallContent)response.Messages[0].Contents[1];
            // 设置控制台输出颜色为绿色,用于突出显示工具调用信息
            Console.ForegroundColor = ConsoleColor.Green;
            string arguments = &#34;&#34;;
            // 如果函数调用包含参数,则拼接参数信息
            if (functionCall.Arguments != null)
            {
                foreach (var arg in functionCall.Arguments)
                {
                    arguments += $&#34;{arg.Key}:{arg.Value};&#34;;
                }
                // 输出调用的方法名及参数信息
                Console.WriteLine($&#34;调用方法名:{functionCall.Name};参数信息:{arguments}&#34;);
                // 遍历所有 Tool 消息,输出每个工具调用的结果
                foreach (var message in toolUseMessage)
                {
                    // 提取工具调用后的执行结果
                    var functionResultContent = (FunctionResultContent)message.Contents[0];
                    Console.WriteLine($&#34;调用工具结果:{functionResultContent.Result}&#34;);
                }
                // 恢复控制台默认颜色(白色)
                Console.ForegroundColor = ConsoleColor.White;
            }
            else
            {
                // 如果没有参数
                Console.WriteLine(&#34;工具参数为空&#34;);
            }
        }
        else
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(&#34;本次没有调用工具&#34;);
            Console.ForegroundColor = ConsoleColor.White;
        }
    }
}

三、为LLM添加工具能力

在前面课程基础之上,在Program.cs添加代码。 图片 代码说明:为LLM添加工具能力,并处理客户提交的内容。

// 创建聊天客户端实例
ChatAIClient chatAIClient = new ChatAIClient();
// 进入主循环,持续接收用户输入直到输入 &#34;exit&#34;
while (true)
{
    try
    {
        // 设置控制台文字颜色为黄色,提示用户输入问题
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.Write(&#34;\n提问: &#34;);
        // 读取用户输入并去除前后空格,若为空则赋默认空字符串
        string query = Console.ReadLine()?.Trim() ?? string.Empty;
        // 判断用户是否输入 &#34;exit&#34; 以退出程序
        if (query.ToLower() == &#34;exit&#34;)
        {
            break;
        }
        // 调用异步方法处理用户查询,并传入预定义的工具列表(listToolsResult)
        string response = await chatAIClient.ProcessQueryAsync(query, listToolsResult);
        // 设置输出颜色为黄色,显示 AI 的响应内容
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine($&#34;AI:{response}&#34;);
        // 恢复控制台默认颜色(白色)
        Console.ForegroundColor = ConsoleColor.White;
    }
    catch (Exception ex)
    {
        // 捕获所有异常并输出错误信息,防止程序崩溃
        Console.WriteLine($&#34;\nError: {ex.Message}&#34;);
    }
}

四、测试效果

启动项目,并输入以下内容:

抓取 https://blog.csdn.net/daremeself/article/details/147166987 的内容,并markdown格式输出

调用MCP Server的工具的情况日志。 图片 AI响应的结果: 图片 好了,今天就分享到这边! 下一个课程:实现自己的MCP Server。 文中示例代码: https://pan.quark.cn/s/b5b8853200f9