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.pswp.cn/pingmian/92487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92487.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker的安裝使用以及常見的網絡問題

一、什么是DockerDocker是一種容器化技術&#xff0c;用于快速打包、分發和運行程序。他的核心思想是"一次構建&#xff0c;到處運行"&#xff0c;通過將應用及其依賴的環境打包到一個輕量級、可移植的容器中&#xff0c;實現跨平臺一致運行。二、Docker的安裝1.Cent…

C++入門學習

1.命名空間的介紹首先我們看到如下的代碼&#xff0c;在C語言中&#xff1a;#include <stdio.h> #include <stdlib.h> int rand 10; // C語言沒辦法解決類似這樣的命名沖突問題&#xff0c;所以C提出了namespace來解決 int main() {printf("%d\n", rand…

解決python錯誤:playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page() page.goto(url)page.wait_for_load_state(networkidle) 在Python環境中運行以上代碼后報錯: page.wait_for_load_…

爬蟲逆向之雷池waf

本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的。否則由此產生的一切后果均與作者無關&#xff01; 雷池waf概念 雷池 WAF&#xff08;SafeLine&#xff09;是長亭科技開源的一款 Web 應用防火墻&#xff0c;部署在網站前面&#xff0c;把所有進來的 HTTP/…

23種設計模式解析--行為型

行為型模式&#xff08;協作的藝術&#xff09; 觀察者模式 觀察者模式詳解 模式定義 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為設計模式&#xff0c;用于建立對象間一對多的依賴關系。當一個對象&#xff08;Subject&#xff09;狀態變化時&#xff0c;所…

Linux系統之lua 詳解

命令簡介 lua 是 Lua 語言的解釋器&#xff0c;用于加載和執行 Lua 程序&#xff08;包括文本源碼和預編譯的二進制文件&#xff09;。它支持兩種運行模式&#xff1a;批處理模式&#xff08;執行指定腳本文件&#xff09;和交互式模式&#xff08;逐行讀取并執行輸入的命令&am…

visual studio 無明顯錯誤,但是無法編譯成功解決—仙盟創夢IDE

往后面查看rror CS0246: 未能找到類型或命名空間名“SimpleClass”(是否缺少 using 指令或程序集引用?)修復阿雪技術觀在科技發展浪潮中&#xff0c;我們不妨積極投身技術共享。不滿足于做受益者&#xff0c;更要主動擔當貢獻者。無論是分享代碼、撰寫技術博客&#xff0c;還是…

《論文閱讀》傳統CoT方法和提出的CoT Prompting的區分

論文&#xff1a;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models作者對傳統CoT方法和本文提出的CoT Prompting的區分。1. 傳統方法的局限性 (1) 基于微調的CoT&#xff08;Rationale-Augmented Training&#xff09; 實現方式&#xff1a;需人工標注大…

Minio 高性能分布式對象存儲

1、什么是對象存儲? 描述: 對象存儲&#xff08;Object Storage&#xff09;是一種存儲數據的計算機體系結構&#xff0c;它以對象的形式存儲和管理數據。與傳統的文件系統和塊存儲不同&#xff0c;對象存儲將數據作為對象存儲在分布式的存儲集群中&#xff0c;每個對象都有一…

[深度學習] 大模型學習4-RAG技術全景解析

在大語言模型基礎知識一文中&#xff0c;檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;簡稱 RAG&#xff09;技術作為構建大語言模型&#xff08;Large Language Model&#xff0c;簡稱 LLM&#xff09;應用的一種方式已被簡要提及&#xff0c;本文將詳…

4G/5G無線電單元系統

4G/5G無線電單元系統 ADI公司的核心技術和領域專業知識幫助客戶在全球范圍內規劃、設計、打造更出色的高性能通信系統。 我們的無線電單元(RU)設計平臺利用新一代技術來提供高性能解決方案&#xff0c;幫助客戶消除設計障礙、縮短產品開發周期&#xff0c;加快產品上市時間。 價…

HarvardX TinyML小筆記1(番外2:神經網絡)

1 介紹 圖片來自&#xff1a;https://zh.wikipedia.org/zh-cn/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C 神經網絡一直感覺挺神奇的&#xff0c;江湖也說可解釋性很差&#xff0c;無論如何還是學學吧。借這次學習哈佛的TinyML&#xff0c;也就順帶弄了。 這里…

計算機網絡 第2章通信基礎(竟成)

第 2 章 物理層【考綱內容】1.通信基礎 (1) 信道、信號、帶寬、碼元、波特、速率、信源與信宿等基本概念 (2) 奈奎斯特定理與香農定理 (3) 編碼與調制 (4) 電路交換、報文交換與分組交換 (5) 數據報與虛電路2.傳輸介質 (1) 雙絞線、同軸電纜、光纖與無線傳輸介質&#xff1b;(2…

2025-08-09通過授權碼的方式給exe程序充值

2025-08-09通過授權碼的方式給exe程序充值主要點&#xff1a; 一次性授權機制&#xff1a; 新增 .used_licenses 文件記錄所有已使用的授權碼 每次激活前檢查授權碼是否在已使用列表中 激活成功后立即將授權碼標記為已使用 時效性驗證&#xff1a; 授權碼包含過期時間戳&#x…

工具類-高效集合差異計算工具DiffWrapper

集合差異工具類-DiffWrapper 原因 在編輯過程中&#xff0c;肯定會存在對于子表的更新操作&#xff0c;這種更新分為三種&#xff1a; 要加的&#xff0c; 要刪的&#xff0c;要更新的&#xff0c;并且傳參只有一個modifyVO的, 每一個都寫有點過于冗余&#xff0c;故考慮提取一…

SimBA算法實現過程

文章目錄添加噪聲衡量擾動示例數值總結高級索引變量名代碼總體代碼添加噪聲 操作&#xff1a;將頻率擾動通過trans( )轉為像素域擾動加到原始圖像上&#xff08;trans返回頻率域轉換為像素域的結果&#xff09; expanded (images_batch[remaining_indices] # 原始圖像&…

【面試題】cookie和session 的區別

文章目錄一、核心定義與存儲位置二、關鍵區別對比三、典型使用場景四、關聯與依賴總結在Web開發中&#xff0c; Cookie和 Session是兩種常用的狀態管理機制&#xff0c;用于在無狀態的HTTP協議中保存用戶信息&#xff08;如登錄狀態、偏好設置等&#xff09;。二者的核心區別體…

【機器學習】算法調參的兩種方式:網格搜索(枚舉)、隨機搜索

文章目錄一、網格搜索&#xff1a;窮舉式的最優解尋找1、數學推導過程1. 搜索空間的數學結構2. 優化問題的數學性質3. 收斂性分析4. 誤差分析2、為什么網格搜索有效&#xff1f;1. 全局最優性保證2. 可重現性與穩定性3. 參數敏感性分析3、適用場景與局限性二、隨機搜索&#xf…

免費PDF翻譯 離線自建

https://github.com/Byaidu/PDFMathTranslate/blob/main/docs/README_zh-CN.md https://github.com/Byaidu/PDFMathTranslate/releases 方法 針對不同的使用案例&#xff0c;我們提供不同的方法來使用我們的程序&#xff1a;1. UV 安裝 安裝 Python (3.10 < 版本 < 3.12)…

DeepSeek智能考試系統智能體

一、deepseek-app-1.0 1、系統要求 CentOS 7.9Python 3.8Node.js 16MySQL 8.0 2、部署步驟 運行初始化腳本&#xff1a;./scripts/setup.sh初始化數據庫&#xff1a;mysql -u root -p < scripts/init_db.sql啟動服務&#xff1a;./scripts/start.sh 3、訪問地址 前端&…