本文使用.Net编写MCP服务端 + Ollama ,实现简单MCP调用,代码仅实现基本演示功能。
一、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/swashbuckle
builder.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