当前位置: 首页 > news >正文

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

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

文章目录

      • 一、Ollama如何安装使用
      • 二、创建.Net8项目,开发MCP服务端
      • 三、开发MCP客户端,并对接Ollama

一、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/swashbucklebuilder.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

在这里插入图片描述

http://www.dtcms.com/a/320473.html

相关文章:

  • 构建响应式在线客服聊天系统的前端实践 Vue3+ElementUI + CSS3
  • RAG实现:.Net + Ollama + Qdrant 实现文本向量化,实现简单RAG
  • 【优选算法】BFS解决拓扑排序
  • Spring Boot + ECharts 极简整合指南:从零实现动态数据可视化大屏
  • Java Stream API 详解与实战案例
  • 广东省省考备考(第七十天8.8)——言语、判断推理(强化训练)
  • Ubuntu 22.04 安装 Docker 完整指南
  • flutter TLS protocol versions: (TLSv1.2, TLSv1.3)
  • flutter开发(一)flutter命令行工具
  • Flutter开发 多孩子布局组件
  • 在 Debian 系统上安装 Redis服务
  • VRTE 的应用程序部署到Ubuntu上 报错:bash: ./rb_exmd: No such file or directory
  • Korg 电子琴 2025 高级电子琴手机版:专业的音乐创作与演奏工具
  • 平板探测器的主要技术指标
  • 电脑IP地址是“169.254.x.x”而无法上网的原因
  • ubuntu 22.04 使用yaml文件 修改静态ip
  • 论文阅读:AAAI 2024 ExpeL: LLM Agents Are Experiential Learners
  • openpnp - 不连接设备,只大概测试一下摄像头是否好使
  • Zabbix网络发现:自动化监控新利器
  • TestComplete 如何打造高效UI测试体系?
  • Vue开发的3D全景图效果
  • linux信号量和日志
  • 算法训练之字符串
  • 复杂水文环境下识别精度↑86%!陌讯多模态融合算法在水位监测中的优化实践
  • 四、redis入门之集群部署
  • 富士 Instax 12 和 Instax Mini 11 有什么区别?推荐购买哪一款?
  • 【JMeter】调试取样器的使用
  • 全场景音频工作流实践:Melody如何打造音源管理闭环
  • git | git bash变慢解决
  • 基于 Modbus TCP 的飞升 FSH-CF计量泵多段速控制优化研究