.NET 創建MCP使用大模型對話二:調用遠程MCP服務

在上一篇文章.NET 創建MCP使用大模型對話-CSDN博客中,我們簡述了如何使用mcp client使用StdIo模式調用本地mcp server。本次實例將會展示如何使用mcp client模式調用遠程mcp server。

一:創建mcp server

我們創建一個天氣服務。

?新建WebApi項目,選擇.NET9框架,名稱叫做MCPWebAPI。

添加ModelContextProtocol引用,注意當前是preview版本,需要勾選包含發行版才能搜到。

添加ModelContextProtocol.AspNetCore引用,?注意當前是preview版本。

1:在默認生成的Program.cs文件中,注入AddMcpServer和啟用Mcp路由,如下圖:

using ModelContextProtocol.AspNetCore;var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers();
builder.Services.AddOpenApi();//注冊MCPServer,并從當前程序集加載Tool <新增代碼>
builder.Services.AddMcpServer().WithToolsFromAssembly();var app = builder.Build();if (app.Environment.IsDevelopment())
{app.MapOpenApi();
}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();//注冊MCPServer的路由 <新增代碼>
app.MapMcp();app.Run();

2:新增天氣Tool。代碼和上篇文章一直,不再贅述。

using ModelContextProtocol.Server;
using System.ComponentModel;namespace MCPWebAPI.Tools
{[McpServerToolType]public class WeatherTool{[McpServerTool(Name = "Get City Weather"), Description("獲取指定城市的天氣,返回temperature溫度和weather天氣情況組成的json信息。")]public static string GetCurrentWeather([Description("城市名稱")] string city){//隨機溫度var temperature = new Random().Next(-20, 50);//天氣組var weatherList = new string[] { "晴", "多云", "大雨", "小雨", "大雪" };//隨機天氣var weather = weatherList[new Random(Guid.NewGuid().GetHashCode()).Next(0, weatherList.Length - 1)];//模仿json格式返回return "{\"temperature\":" + temperature + ",\"weather\":\"" + weather + "\"}";}}
}

3:運行程序,不報錯即為成功。

[可選]調試工具:

首先,啟動WebApi項目 ,本地端口:5251

在控制臺運行 npx @modelcontextprotocol/inspector 命令

按提示打開http://127.0.0.1:6274/網頁,選擇sse模式,填寫WebApi項目啟動地址+/sse后綴:http://localhost:5251/sse,點擊鏈接即可。

注:如遇報錯 ReferenceError: fetch is not defined ,請升級你的node.js版本,確保高于V18.0。

二:創建 mcp client

流程和上個文章差不多,新建控制臺項目,選擇.NET9框架,名稱叫做MCPClient。

添加ModelContextProtocol引用。

1. 注冊Client

McpClientOptions options = new()
{ClientInfo = new() { Name = "Weather Client", Version = "1.0.0" }
};//1:注冊MCPServer,以項目中引用為例。//上一篇以stdio方式運行MCPServer
/*var config = new McpServerConfig
{Id = "weather",Name = "Weather MCP Server",TransportType = TransportTypes.StdIo,TransportOptions = new Dictionary<string, string>{//運行MCPServer["command"] = "dotnet",["arguments"] = "run --project ../../../../MCPServer --no-build",}
};*///本次以SSE遠程方式連接MCPWebAPI
var config = new McpServerConfig
{Id = "weather",Name = "Weather MCP Server",TransportType = TransportTypes.Sse,Location = "http://127.0.0.1:5251/sse",
};

最大的區別就是使用TransportTypes.Sse模式通訊,并增加Location調用地址。

其他代碼不變。列出Client所有代碼:

using Microsoft.Extensions.AI;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Client;
using ModelContextProtocol.Configuration;
using ModelContextProtocol.Protocol.Transport;
using OpenAI;Console.WriteLine($"程序啟動中,請稍后");McpClientOptions options = new()
{ClientInfo = new() { Name = "Weather Client", Version = "1.0.0" }
};//1:注冊MCPServer,以項目中引用為例。//SSE遠程方式連接MCPWebAPI
var config = new McpServerConfig
{Id = "weather",Name = "Weather MCP Server",TransportType = TransportTypes.Sse,Location = "http://127.0.0.1:5251/sse",
};using var factory =LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Trace));//2:創建MCPClient
await using var mcpClient = await McpClientFactory.CreateAsync(config, options);//3:發現MCPServer中的Tool
var mcpTools = await mcpClient.ListToolsAsync();
foreach (var tool in mcpTools)
{Console.WriteLine($"{tool.Name} ({tool.Description})");
}Console.WriteLine("---------- Tools");
Console.WriteLine();//4:注冊大模型//注冊方式1,使用本地模型。以本地使用Ollama啟動的千問32b模型為例
//var openClient = new OllamaChatClient(new Uri("http://localhost:11434/"), "qwq:32b");//注冊方式2,使用遠程模型。以阿里云百煉平臺為例
var oclinet = new OpenAIClient(new System.ClientModel.ApiKeyCredential("密鑰"), new OpenAIClientOptions
{Endpoint = new Uri("https://dashscope.aliyuncs.com/compatible-mode/v1")
});
//模型名稱
var openClient = new OpenAIChatClient(oclinet, "qwen-max");//測試模型,使用流式輸出。
var res = openClient.GetStreamingResponseAsync("你好");
await foreach (var message in res)
{Console.Write(message);
}
Console.WriteLine();Console.WriteLine("-------------llm test");
Console.WriteLine();//5:創建Chat客戶端
var client = new ChatClientBuilder(openClient)//添加日志.UseLogging(factory)//向聊天客戶端添加函數調用.UseFunctionInvocation().Build();//6:執行對話
var msg = "";while (true)
{Console.WriteLine();Console.WriteLine("這里是天氣服務,你想咨詢哪里的天氣?");msg = Console.ReadLine();if (msg == "exit"){Console.WriteLine("程序退出");return;}IList<ChatMessage> messages =[//為ai設定身份new(ChatRole.System, """你是一個天氣助理,在輸出天氣時,請以家長口吻叮囑用戶添衣、帶傘等。"""),new(ChatRole.User, msg)];//區別于GetStreamingResponseAsync,此處示例非流式輸出//注意,某些大模型要求流水輸出,只能使用GetStreamingResponseAsync方式。var response =await client.GetResponseAsync(messages,new ChatOptions { Tools = [.. mcpTools] });Console.WriteLine(response);}

代碼倉庫:https://github.com/zhanglilong23/mcpdemo.git

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75498.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75498.shtml

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

相關文章

Redis 中 Set(例如標簽) 和 ZSet(例如排行榜) 的詳細對比,涵蓋定義、特性、命令、適用場景及總結表格

以下是 Redis 中 Set 和 ZSet 的詳細對比&#xff0c;涵蓋定義、特性、命令、適用場景及總結表格&#xff1a; 1. 核心定義 數據類型SetZSet&#xff08;Sorted Set&#xff09;定義無序的、唯一的字符串集合&#xff0c;元素不重復。有序的、唯一的字符串集合&#xff0c;每個…

解決Spring參數解析異常:Name for argument of type XXX not specified

前言 在開發 Spring Boot 應用時&#xff0c;我們常遇到類似 java.lang.IllegalArgumentException: Name for argument not specified 的報錯。這類問題通常與方法參數名稱的解析機制相關&#xff0c;尤其在使用 RequestParam、PathVariable 等注解時更為常見。 一、問題現象與…

剛剛,OpenAI開源PaperBench,重塑頂級AI Agent評測

今天凌晨1點&#xff0c;OpenAI開源了一個全新的AI Agent評測基準——PaperBench。 這個基準主要考核智能體的搜索、整合、執行等能力&#xff0c;需要對2024年國際機器學習大會上頂尖論文的復現&#xff0c;包括對論文內容的理解、代碼編寫以及實驗執行等方面的能力。 根據O…

Golang封裝Consul 服務發現庫

以下是一個經過生產驗證的 Consul 服務發現封裝庫,支持注冊/注銷、健康檢查、智能發現等核心功能,可直接集成到項目中: package consulimport ("context""fmt""log""math/rand""net""os""sync"&quo…

自適應信號處理任務(過濾,預測,重建,分類)

自適應濾波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000

PyTorch深度學習框架 的基礎知識

目錄 1.pyTorch檢查是否安裝成功 2.PyTorch的張量tensor 基礎創建方式&#xff08;三種&#xff09; 2.2用列表創建tensor 2.2使用元組創建 tensor 2.3使用ndarray創建創建 tensor 2.4 快速創建tensor的常用方法 3.pyTorch中的張量tensor的常用屬性 4. tensor中的基礎數據…

MySQL學習集--DDL

DDL 數據庫操作 查詢所有數據庫 SHOW DATABASES;查詢當前數據庫 SELECT DATABASE();創建 CREATE DATABASE[IF NOT EXISTS]數據庫名[DEFAULT CHARSET 字符集][COLLATE 排序規則];刪除 DROR DATABASE[IF EXISTS]數據庫名;使用 USE 數據庫名;表操作 創建表格 CREATE TABL…

Vue 3 中按照某個字段將數組分成多個數組

方法一&#xff1a;使用 reduce 方法 const originalArray [{ id: 1, category: A, name: Item 1 },{ id: 2, category: B, name: Item 2 },{ id: 3, category: A, name: Item 3 },{ id: 4, category: C, name: Item 4 },{ id: 5, category: B, name: Item 5 }, ];const grou…

LeetCode刷題 -- 48. 旋轉圖像

題目 算法題解&#xff1a;順時針旋轉矩陣&#xff08;90度&#xff09; 1. 算法描述 給定一個 n n 的二維矩陣&#xff0c;請將矩陣順時針旋轉 90 度。 例如&#xff1a; 輸入&#xff1a; [[1,2,3],[4,5,6],[7,8,9] ]輸出&#xff1a; [[7,4,1],[8,5,2],[9,6,3] ]2. 思…

Vulkan進階系列1 - Vulkan應用程序結構(完整代碼)

一: 概述 在前面的20多篇文章中,我們了解了Vulkan的基礎知識,和相關API的使用,接下來我們要從零開始寫一套完整Vulkan應用程序,在這個過程中加深對Vulkan中的各種概念的理解。 Vulkan 應用程序一般遵循 初始化 -> 運行循環 -> 資源清理 的結構,本實例也基本遵循了…

VTK的兩種顯示刷新方式

在類中先聲明vtk的顯示對象 vtkRenderer out_render; vtkVertexGlyphFilter glyphFilter; vtkPolyDataMapper mapper; // 新建制圖器 vtkActor actor; // 新建角色 然后在init中先初始化一下&#xff1a; out_rend…

【CSS3】04-標準流 + 浮動 + flex布局

本文介紹浮動與flex布局。 目錄 1. 標準流 2. 浮動 2.1 基本使用 特點 脫標 2.2 清除浮動 2.2.1 額外標簽法 2.2.2 單偽元素法 2.2.3 雙偽元素法(推薦) 2.2.4 overflow(最簡單) 3. flex布局 3.1 組成 3.2 主軸與側軸對齊方式 3.2.1 主軸 3.2.2 側軸 3.3 修改主…

詳細介紹一下C++的按位運算

在C中&#xff0c;按位運算&#xff08;Bitwise Operations&#xff09; 是直接對二進制位&#xff08;bit&#xff09;進行操作的低級運算&#xff0c;常用于處理硬件、優化性能、加密算法或底層資源管理。以下是按位運算符的詳細說明、示例和典型應用場景&#xff1a; 1.按位…

Flask與 FastAPI 對比:哪個更適合你的 Web 開發?

在開發 Web 應用時&#xff0c;Python 中有許多流行的 Web 框架可以選擇&#xff0c;其中 Flask 和 FastAPI 是兩款廣受歡迎的框架。它們各有特色&#xff0c;適用于不同的應用場景。本文將從多個角度對比這兩個框架&#xff0c;幫助你更好地選擇適合的框架來構建你的 Web 應用…

Python爬蟲第一戰(爬取優美圖庫網頁圖片)

本文是我在學習過程中記錄學習的點點滴滴,目的是為了學完之后鞏固一下順便也和大家分享一下,日后忘記了也可以方便快速的復習。 爬取網頁圖片 前言前言 今天學習的主要是關于如何利用Python爬取網頁圖片知識的理解和應用 # 1.獲取網頁信息,交給beautifulsoup # 2.獲取頁面里…

J1 ResNet-50算法實戰與解析

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 一、理論知識儲備 1. 殘差網絡的由來 ResNet主要解決了CNN在深度加深時的退化問題&#xff08;梯度消失與梯度爆炸&#xff09;。 雖然B…

Python入門(3):語句

目錄 1 基本語句 1.1 表達式語句 1.2 賦值語句 2 控制流語句 2.1 條件語句 2.2 循環語句 while循環&#xff1a; for循環&#xff1a; 2.3 流程控制語句 1. break語句&#xff1a;退出整個循環體 2. continue語句&#xff1a;只跳過本次循環&#xff0c;還會進…

淺淺嘗試Numpy的函數s:

1.numpy.empty: numpy.empty方法用來創建一個指定形狀&#xff08;shape&#xff09;&#xff0c;數據類型&#xff08;dtype&#xff09;且未被初始化的數組&#xff1a; numpy.empty(shape,dtype float,order C) 參數說明&#xff1a; shape:數組形狀。 dtype:數據類型&am…

【C++】nlohmann::json 配置加載技術實踐:從基礎到高級應用

一、nlohmann::json 庫概況與核心特性 nlohmann::json 是 C 社區最受歡迎的 JSON 庫之一&#xff0c;其設計理念簡潔即美&#xff0c;通過單頭文件實現完整的 JSON 解析、序列化和操作功能。 1.1 基本特性 nlohmann::json是一個現代C編寫的開源JSON庫&#xff0c;采用MIT協議…