C#实现MCP Client 与 LLM 连接,抓取网页内容功能!
- 作者: 五速梦信息网
- 时间: 2026年04月20日 04:36
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 => m.Role == ChatRole.Tool).ToList();
// 判断是否调用了工具
// 获取响应中所有角色为 Tool 的消息(即 AI 调用了哪些工具)
var toolUseMessage = response.Messages.Where(m => m.Role == ChatRole.Tool);
// 判断第一条消息的内容是否多于一个(通常第一个消息是用户问题,第二个是调用函数)
if (response.Messages[0].Contents.Count > 1)
{
// 尝试从第一条消息的第二个内容项提取出函数调用信息
var functionCall = (FunctionCallContent)response.Messages[0].Contents[1];
// 设置控制台输出颜色为绿色,用于突出显示工具调用信息
Console.ForegroundColor = ConsoleColor.Green;
string arguments = "";
// 如果函数调用包含参数,则拼接参数信息
if (functionCall.Arguments != null)
{
foreach (var arg in functionCall.Arguments)
{
arguments += $"{arg.Key}:{arg.Value};";
}
// 输出调用的方法名及参数信息
Console.WriteLine($"调用方法名:{functionCall.Name};参数信息:{arguments}");
// 遍历所有 Tool 消息,输出每个工具调用的结果
foreach (var message in toolUseMessage)
{
// 提取工具调用后的执行结果
var functionResultContent = (FunctionResultContent)message.Contents[0];
Console.WriteLine($"调用工具结果:{functionResultContent.Result}");
}
// 恢复控制台默认颜色(白色)
Console.ForegroundColor = ConsoleColor.White;
}
else
{
// 如果没有参数
Console.WriteLine("工具参数为空");
}
}
else
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("本次没有调用工具");
Console.ForegroundColor = ConsoleColor.White;
}
}
}
三、为LLM添加工具能力
在前面课程基础之上,在Program.cs添加代码。
代码说明:为LLM添加工具能力,并处理客户提交的内容。
// 创建聊天客户端实例
ChatAIClient chatAIClient = new ChatAIClient();
// 进入主循环,持续接收用户输入直到输入 "exit"
while (true)
{
try
{
// 设置控制台文字颜色为黄色,提示用户输入问题
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("\n提问: ");
// 读取用户输入并去除前后空格,若为空则赋默认空字符串
string query = Console.ReadLine()?.Trim() ?? string.Empty;
// 判断用户是否输入 "exit" 以退出程序
if (query.ToLower() == "exit")
{
break;
}
// 调用异步方法处理用户查询,并传入预定义的工具列表(listToolsResult)
string response = await chatAIClient.ProcessQueryAsync(query, listToolsResult);
// 设置输出颜色为黄色,显示 AI 的响应内容
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"AI:{response}");
// 恢复控制台默认颜色(白色)
Console.ForegroundColor = ConsoleColor.White;
}
catch (Exception ex)
{
// 捕获所有异常并输出错误信息,防止程序崩溃
Console.WriteLine($"\nError: {ex.Message}");
}
}
四、测试效果
启动项目,并输入以下内容:
抓取 https://blog.csdn.net/daremeself/article/details/147166987 的内容,并markdown格式输出
调用MCP Server的工具的情况日志。
AI响应的结果:
好了,今天就分享到这边!
下一个课程:实现自己的MCP Server。
文中示例代码: https://pan.quark.cn/s/b5b8853200f9
相关文章
-
c#开发完整的Socks5代理客户端与服务端——客户端(已完结)
c#开发完整的Socks5代理客户端与服务端——客户端(已完结)
- 互联网
- 2026年04月20日
-
C#基础之线程安全集合讲解
C#基础之线程安全集合讲解
- 互联网
- 2026年04月20日
-
C#基础:枚举、数组、类型、函数等解析
C#基础:枚举、数组、类型、函数等解析
- 互联网
- 2026年04月20日
-
C#线程池核心技术:从原理到高效调优的实用指南
C#线程池核心技术:从原理到高效调优的实用指南
- 互联网
- 2026年04月20日
-
C#学习:构建一个更真实的基于LLM的简历评估系统
C#学习:构建一个更真实的基于LLM的简历评估系统
- 互联网
- 2026年04月20日
-
C#中的in、out、ref、in T、out T、[In]、[Out]关键字解析
C#中的in、out、ref、in T、out T、[In]、[Out]关键字解析
- 互联网
- 2026年04月20日





