当前位置: 首页 > 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.lryc.cn/news/614008.html

相关文章:

  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的运营策略创新研究
  • k8s调度问题
  • Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)
  • 自动驾驶数据闭环
  • WiFi 核心概念与实战用例全解
  • Redis基础数据类型
  • 【DFS系列 | 递归】DFS算法入门:递归原理与实现详解
  • 【MySQL】初识索引
  • 优选算法2
  • Redis中String数据结构为什么以长度44为embstr和raw实现的分界线?
  • 【JavaEE】(10) JavaEE 简介
  • 多级缓存架构:新品咖啡上线引发的数据库压力风暴与高并发实战化解方案
  • Spring Boot Redis 缓存完全指南
  • 破解 Django N+1 查询困境:使用 select_related 与 prefetch_related 实践指南
  • sqlite的sql语法与技术架构研究
  • http请求响应
  • npm run 常见脚本
  • token过期为了保证安全,refresh token不过期,那么拿到refresh token就可以获取token,不还是不安全吗
  • C/C++与JavaScript的WebAssembly协作开发指南
  • 【科研绘图系列】R语言绘制气泡图
  • 【优选算法】多源BFS
  • CALL与 RET指令及C#抽象函数和虚函数执行过程解析
  • 【代码随想录day 14】 力扣 111.二叉树的最小深度
  • 集成电路学习:什么是URDF统一机器人描述格式
  • Spring MVC 父子容器深度解析:原理、实战与优化
  • Pytest项目_day09(skip、skipif跳过)
  • iOS 签名证书全流程详解,申请、管理与上架实战
  • 三方相机问题分析七:【datespace导致GPU异常】facebook 黑块和Instagram花图问题
  • 【性能测试】-2- JMeter工具的使用
  • 网吧在线选座系统|基于java和小程序的网吧在线选座小程序系统设计与实现(源码+数据库+文档)