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

相关推荐
一包烟电脑面前做一天4 小时前
RAG实现:.Net + Ollama + Qdrant 实现文本向量化,实现简单RAG
.net·向量数据库·ai大模型·rag·ollama·qdrant·文本分块
彼方卷不动了5 小时前
【AI 学习】用 Kotlin 开发一个最基础的 MCP Server 并让它与 Cursor 联动
人工智能·kotlin·mcp
Lsx_7 小时前
分不清RAG 、Function Call、MCP、Agent?一文秒懂它们的区别和联系
前端·agent·mcp
大模型真好玩10 小时前
深入浅出LangChain AI Agent智能体开发教程(七)—LangChain多智能体浏览器自动化
人工智能·python·mcp
SelectDB11 小时前
Doris MCP Server 0.5.1 版本发布
github·apache·mcp
蓝点lilac12 小时前
C# WPF 内置解码器实现 GIF 动图控件
c#·.net·wpf·图像
唐青枫13 小时前
别再用 Thread 了!掌握 C#.NET Task 异步编程的正确打开方式
c#·.net
Hoper.J1 天前
深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器
mcp·fastmcp·mcp.tool·mcp.resource·mcp.prompt