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

发布于:2025-08-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到