MCP实现:.Net实现MCP服务端 + Ollama ,MCP服务端工具调用
本文使用.Net编写MCP服务端 + Ollama ,实现简单MCP调用,代码仅实现基本演示功能。
文章目录
- 一、Ollama如何安装使用
- 二、创建.Net8项目,开发MCP服务端
- 三、开发MCP客户端,并对接Ollama
一、Ollama如何安装使用
请移步:https://blog.csdn.net/MrTraum/article/details/139240885
二、创建.Net8项目,开发MCP服务端
可使用WebApi或者控制台项目,本示例使用了WebApi
引入以下包:
ModelContextProtocol.AspNetCore
开发MCP服务端工具类:
[McpServerToolType]
public static class EchoTool
{[McpServerTool, Description("拼接后返回给客户端")]public static string Echo(string message) => $"你好你好 {message}";[McpServerTool, Description("用于计算两个数字的和,接收两个整数参数 a 和 b")]public static int Add([Description("第一个加数")]int a, [Description("第二个加数")] int b) => a + b;
}
以上代码提供了两个工具,一个字符串拼接,一个两个数相加。
注册MCP工具,启动服务
builder.Services.AddMcpServer()//.WithStdioServerTransport()//使用stdio方式调用.WithHttpTransport(options =>//使用http或者sse方式调用{//如果为true,则将禁用“/sse”端点options.Stateless = false;}).WithToolsFromAssembly();
app.MapMcp();
完整Program代码如下:
public class Program
{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();builder.Logging.AddConsole(consoleLogOptions =>{consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;});builder.Services.AddMcpServer()//.WithStdioServerTransport()//使用stdio方式调用.WithHttpTransport(options =>//使用http或者sse方式调用{//如果为true,则将禁用“/sse”端点options.Stateless = false;}).WithToolsFromAssembly();//自动检索当前程序集下[McpServerToolType]的类进行工具注册var app = builder.Build();app.UseSwagger();app.UseSwaggerUI();app.UseAuthorization();app.MapControllers();app.MapMcp();app.Run();}
}
至此MCP服务端已开发完成。
三、开发MCP客户端,并对接Ollama
引入以下包:
OllamaSharp.ModelContextProtocol
private readonly string ModelName = "llama3.1:8b";
private readonly string OllamaUrl = "http://192.168.24.225:11434/";
[HttpGet]
public async Task<string> Test([FromQuery] string query = "请计算3加5的和是多少")
{// 创建日志工厂var loggerFactory = LoggerFactory.Create(builder =>{builder.AddConsole();});// 配置 MCP 服务器 - 使用 SSE 传输方式var serverConfigs = new[] {new McpServerConfiguration{Name = "csharp-mcp-sse-server",// SSE 服务端地址Command = "http://192.168.24.225:5069/",//MCP服务端部署地址TransportType = McpServerTransportType.Sse//采用Sse方式进行调用}};// 从 MCP 服务器获取工具var tools = await Tools.GetFromMcpServers(mcpServers: serverConfigs,clientOptions: new McpClientOptions{LoggerFactory = loggerFactory,InitializationTimeout = TimeSpan.FromSeconds(30)});Console.WriteLine($"获取工具列表:");foreach (var tool in tools){Console.WriteLine($"- {tool.Function.Name}: {tool.Function.Description}");}// 初始化 Ollama 客户端var ollama = new OllamaApiClient(new Uri(OllamaUrl));// 创建聊天并添加 MCP 工具// 调用大模型整理结果var chatRequest = new ChatRequest{Model = ModelName,Stream = false,Think = false,Messages = new List<Message>(){new Message { Role = ChatRole.User, Content = query }},Tools = tools,//添加MCP工具};var resp = await ollama.ChatAsync(chatRequest, CancellationToken.None).StreamToEndAsync();//判断大模型是否调用MCP工具if (resp.Message.ToolCalls.Any()){var toolCall = resp.Message.ToolCalls.First();Console.WriteLine($"调用的工具: {toolCall.Function.Name}");// 执行MCP工具调用,并获取结果var tool = tools.FirstOrDefault(t => t.Function.Name == toolCall.Function.Name);var toolResult = await tool.InvokeMethodAsync(toolCall.Function.Arguments);Console.WriteLine($"工具调用结果: {toolResult}");return $"{toolResult}";}return resp.Message.Content;}
入参:请计算3和5的和是多少
,调用了Add工具,结果返回:8