本文使用.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