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

相关推荐
VIP_CQCRE4 小时前
在 Visual Studio 里接入 AI 编程能力:用 Ace Data Cloud + LMLocal 打通 OpenAI 兼容接口
openai·ai编程·visual studio·mcp·ace data cloud
Blockbuater_drug5 小时前
Agent Skills 与 MCP 主站全景:两大生态入口与合流趋势
agent·站点·mcp·skills
EatFan7 小时前
2026 后端 AI 集成三条落地路径:Spring AI 2.0、MCP 协议与旁路服务怎么选
java·人工智能·spring boot·spring·大模型·spring ai·mcp
xrlfreedom8 小时前
MCP 面试高频考点:用 Docker 与 Resources 沉淀可复用 Prompts 工作流,怎么答才落地
docker·resources·mcp
CSharp精选营8 小时前
IIS 后面挂 Kestrel,这 3 个配置错了就 502
kestrel·.net·iis配置
鑫 源9 小时前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
xrlfreedom20 小时前
MCP 面试高频考点:把知识库 RAG 检索封装成 Tool,Java 落地要避哪些坑?
tools·mcp·java mcp sdk
更深兼春远1 天前
第3篇:给 Dify 接上大模型——云端 API 与本地 Ollama 两种方式
大模型·dify·ollama·deepseek·apikey
小蒋观天下1 天前
端侧大模型在安防摄像头部署实操(上)|行业痛点、架构选型、落地思路解析
大数据·人工智能·安全·计算机视觉·ai大模型
VIP_CQCRE1 天前
用 Ace Data Cloud 快速把 Discord 接入 AI Agent:MCP + REST API 双通道实践
rest api·ai agent·开发者工具·mcp·ace data cloud