MCP实现:.Net实现MCP服务端 + Ollama ,MCP服务端工具调用

本文使用.Net编写MCP服务端 + Ollama ,实现简单MCP调用,代码仅实现基本演示功能。

文章目录

一、Ollama如何安装使用

请移步:https://blog.csdn.net/MrTraum/article/details/139240885

二、创建.Net8项目,开发MCP服务端

可使用WebApi或者控制台项目,本示例使用了WebApi
引入以下包:
ModelContextProtocol.AspNetCore

开发MCP服务端工具类:

csharp 复制代码
[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工具,启动服务

csharp 复制代码
builder.Services
    .AddMcpServer()
    //.WithStdioServerTransport()//使用stdio方式调用
    .WithHttpTransport(options =>//使用http或者sse方式调用
    {
        //如果为true,则将禁用"/sse"端点
        options.Stateless = false;
    })
    .WithToolsFromAssembly();
app.MapMcp();

完整Program代码如下:

csharp 复制代码
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

csharp 复制代码
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

相关推荐
多米哇卡5 小时前
《大模型安全白皮书2.0》发布,12项标准规范AI全生命周期
ai大模型·大模型安全白皮书2.0·ai规范
AI行业学习5 小时前
.NET Framework 3.5 官方离线包下载+完整安装教程【2026.5.29】
windows·.net·notepad++
文歌子5 小时前
MCP 协议:AI 地学工具链的通用胶水
llm·mcp
我是唐青枫6 小时前
C#.NET YARP 服务发现实战:接入 Consul 和 Kubernetes 动态发现后端服务
c#·服务发现·.net
一个帅气昵称啊6 小时前
NetcoreKevin:.NET 企业级智能体管理框架
.net
light blue bird6 小时前
工序路径主子表单工序组装图表组件
前端·数据库·信息可视化·.net·web端·razor page
SEO-狼术7 小时前
Visualize Trends with Bar Charts
pdf·.net
步步为营DotNet8 小时前
解锁.NET 11:Native AOT 在高性能后端服务的深度实践与剖析
.net
望晨空忧19 小时前
Avalonia 制作复杂布局动画
.net·avalonia
唐青枫1 天前
C#.NET YARP 服务发现实战:接入 Consul 和 Kubernetes 动态发现后端服务
c#·.net