.NET?MCP?文檔詳細(xì)指南
MCP 概述
MCP(Model Context Protocol)是由 Anthropic 推出的一種開(kāi)放協(xié)議,類(lèi)似 AI 的 USB-C 擴(kuò)展塢,用于在大模型和數(shù)據(jù)源之間建立安全的通信(授權(quán)),讓 AI 應(yīng)用能夠安全地訪(fǎng)問(wèn)和操作本地或遠(yuǎn)程數(shù)據(jù),例如操作本地文件、瀏覽器和 Web 服務(wù)。
為了更好地理解 MCP,我們可以用一個(gè)簡(jiǎn)單的類(lèi)比:如果把 AI 比作電腦主機(jī),那么 MCP 就相當(dāng)于 USB 協(xié)議,而 MCP Server 則類(lèi)似于各種 USB 設(shè)備(如攝像頭、麥克風(fēng)等)。通過(guò)實(shí)現(xiàn) MCP Server,我們可以讓 AI 輕松連接到各種數(shù)據(jù)源,大大擴(kuò)展其功能范圍。
MCP 協(xié)議的核心價(jià)值在于標(biāo)準(zhǔn)化了 AI 模型與外部工具和數(shù)據(jù)源的交互方式,使開(kāi)發(fā)者能夠創(chuàng)建可被多種 AI 應(yīng)用程序使用的工具和服務(wù)。這種標(biāo)準(zhǔn)化的接口極大地簡(jiǎn)化了 AI 應(yīng)用的開(kāi)發(fā)過(guò)程,并提高了工具和服務(wù)的可重用性。
MCP 的主要特點(diǎn)
- 標(biāo)準(zhǔn)化的工具調(diào)用接口
- 安全的雙向通信
- 支持多種傳輸方式(stdio、SSE、WebSocket 等)
- 豐富的數(shù)據(jù)類(lèi)型支持
- 與主流 LLM 的無(wú)縫集成
- 跨平臺(tái)和跨語(yǔ)言支持
MCP 服務(wù)器
MCP 服務(wù)器是實(shí)現(xiàn) MCP 協(xié)議的服務(wù)端,負(fù)責(zé)注冊(cè)和提供工具,處理客戶(hù)端的工具調(diào)用請(qǐng)求,并返回結(jié)果。服務(wù)器可以使用多種傳輸方式與客戶(hù)端通信,如標(biāo)準(zhǔn)輸入輸出、SSE 或 WebSocket。
MCP 客戶(hù)端
MCP 客戶(hù)端是實(shí)現(xiàn) MCP 協(xié)議的客戶(hù)端,負(fù)責(zé)連接到 MCP 服務(wù)器,獲取可用工具列表,調(diào)用工具,并處理返回結(jié)果??蛻?hù)端通常與 LLM 集成,使 LLM 能夠使用 MCP 工具。
.NET MCP 實(shí)現(xiàn)項(xiàng)目對(duì)比
在 .NET 生態(tài)系統(tǒng)中,目前有幾個(gè)主要的 MCP 實(shí)現(xiàn)項(xiàng)目,它們各有特點(diǎn)。以下是這些項(xiàng)目的對(duì)比分析:
官方 C# SDK:csharp-sdk
這是 Model Context Protocol(MCP)官方提供的 C# SDK,為 MCP 服務(wù)器和客戶(hù)端提供簡(jiǎn)單易用的接口,主要由微軟維護(hù)。該項(xiàng)目已經(jīng)成為 MCP 社區(qū)的官方 SDK 項(xiàng)目,最近發(fā)布了 0.1.0-preview 版本。
GitHub 倉(cāng)庫(kù):
https://github.com/modelcontextprotocol/csharp-sdk
MCPSharp
MCPSharp 是一個(gè) .NET 庫(kù),旨在幫助開(kāi)發(fā)者構(gòu)建 Model Context Protocol(MCP)服務(wù)器和客戶(hù)端。它提供了創(chuàng)建 MCP 合規(guī)的工具和函數(shù)、連接現(xiàn)有 MCP 服務(wù)器、將 .NET 方法暴露為 MCP 端點(diǎn)、處理 MCP 協(xié)議細(xì)節(jié)和 JSON-RPC 通信等功能。
特點(diǎn):
- 與 Microsoft.Extensions.AI 集成
- Semantic Kernel 支持
- 動(dòng)態(tài)工具注冊(cè)
- 工具變更通知
- 復(fù)雜對(duì)象參數(shù)支持
- 錯(cuò)誤處理
- 易用的基于屬性的 API
- 內(nèi)置 JSON-RPC 支持
- 自動(dòng)參數(shù)驗(yàn)證和類(lèi)型轉(zhuǎn)換
GitHub 倉(cāng)庫(kù):
https://github.com/afrise/MCPSharp
mcpdotnet
mcpdotnet 是一個(gè) .NET 實(shí)現(xiàn)的模型上下文協(xié)議(MCP),使 .NET 應(yīng)用程序能夠與 MCP 客戶(hù)端和服務(wù)器進(jìn)行交互。該項(xiàng)目已經(jīng)進(jìn)入歸檔狀態(tài),相關(guān)的開(kāi)發(fā)工作都集中到了官方的 csharp-sdk。
特點(diǎn):
- 支持多種 MCP 功能
- 遵循規(guī)范的實(shí)現(xiàn)
- 提供全面的日志支持
- 兼容 .NET 8.0 及以上版本
GitHub 倉(cāng)庫(kù):
https://github.com/PederHP/mcpdotnet
ModelContextProtocol.NET
ModelContextProtocol.NET 是一個(gè) C# SDK,實(shí)現(xiàn)了模型上下文協(xié)議(MCP)。
特點(diǎn):
- 標(biāo)準(zhǔn)輸入輸出通信
- 工具集成框架
- 原生 AOT 兼容
- 計(jì)算器演示實(shí)現(xiàn)
- 開(kāi)發(fā)中功能:WebSocket 支持、資源管理和提示系統(tǒng)
GitHub倉(cāng)庫(kù):
https://github.com/salty-flower/ModelContextProtocol.NET
服務(wù)器端實(shí)現(xiàn)
基本結(jié)構(gòu)
使用官方的 C# SDK (csharp-sdk) 實(shí)現(xiàn) MCP 服務(wù)器的基本結(jié)構(gòu)如下:
這段代碼展示了如何創(chuàng)建一個(gè)基本的 MCP 服務(wù)器,它使用標(biāo)準(zhǔn)輸入輸出(stdio)作為傳輸方式,并自動(dòng)注冊(cè)當(dāng)前程序集中的所有工具。
關(guān)鍵組件說(shuō)明:
AddMcpServer()
- 向依賴(lài)注入容器添加 MCP 服務(wù)器服務(wù)
WithStdioServerTransport()
- 配置服務(wù)器使用標(biāo)準(zhǔn)輸入輸出作為傳輸方式
WithToolsFromAssembly()
- 自動(dòng)注冊(cè)當(dāng)前程序集中的所有 MCP 工具
工具注冊(cè)與實(shí)現(xiàn)
在 MCP 服務(wù)器中,工具是通過(guò)特性(Attribute)來(lái)注冊(cè)的。下面是一個(gè)簡(jiǎn)單的工具實(shí)現(xiàn)示例:
[McpServerToolType] public static class EchoTool { [McpServerTool, Description("Echoes the message back to the client.")] public static string Echo(string message) => $"hello {message}"; }
更復(fù)雜的工具可以使用依賴(lài)注入和服務(wù)器交互:
在 QuickstartWeatherServer 示例中,我們可以看到更實(shí)際的工具實(shí)現(xiàn):
[McpServerToolType] public static class WeatherTools { [McpServerTool, Description("Get weather alerts for a US state.")] public static async Task GetAlerts( HttpClient client, [Description("The US state to get alerts for.")] string state) { var jsonElement = await client.GetFromJsonAsync($"/alerts/active/area/{state}"); var alerts = jsonElement.GetProperty("features").EnumerateArray(); if (!alerts.Any()) { return "No active alerts for this state."; } return string.Join("\n-\n", alerts.Select(alert => { JsonElement properties = alert.GetProperty("properties"); return $""" Event: {properties.GetProperty("event").GetString()} """; })); } }
工具注冊(cè)特性說(shuō)明: [McpServerToolType]
- 標(biāo)記一個(gè)類(lèi)包含 MCP 工具
[McpServerTool]
- 標(biāo)記一個(gè)方法作為 MCP 工具
[Description]
- 提供工具和參數(shù)的描述信息
服務(wù)配置
MCP 服務(wù)器的配置主要通過(guò) .NET 的依賴(lài)注入系統(tǒng)完成。以下是一個(gè)配置 HttpClient 的示例:
builder.Services.AddSingleton(_ => { var client = new HttpClient() { BaseAddress = new Uri("https://api.weather.gov") }; client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("weather-tool", "1.0")); return client; });
高級(jí)配置選項(xiàng):
- 自定義傳輸方式:除了標(biāo)準(zhǔn)的 stdio 傳輸方式,還可以配置 SSE 或 WebSocket 傳輸
- 工具過(guò)濾:可以選擇性地注冊(cè)特定的工具,而不是注冊(cè)所有工具
- 中間件:可以添加自定義中間件來(lái)處理請(qǐng)求和響應(yīng)
- 錯(cuò)誤處理:可以配置全局錯(cuò)誤處理策略
- 日志記錄:可以配置詳細(xì)的日志記錄選項(xiàng)
客戶(hù)端實(shí)現(xiàn)
連接到 MCP 服務(wù)器
使用官方的 C# SDK 連接到 MCP 服務(wù)器的基本代碼如下:
var mcpClient = await McpClientFactory.CreateAsync(new() { Id = "demo-server", Name = "Demo Server", TransportType = TransportTypes.StdIo, TransportOptions = new() { ["command"] = command, ["arguments"] = arguments, } });
這段代碼創(chuàng)建了一個(gè) MCP 客戶(hù)端,并連接到指定的服務(wù)器。TransportType
指定了通信方式(這里是標(biāo)準(zhǔn)輸入輸出),TransportOptions
提供了額外的配置選項(xiàng)。
支持的傳輸類(lèi)型: TransportTypes.Stdio
- 使用標(biāo)準(zhǔn)輸入輸出進(jìn)行通信
TransportTypes.Sse
- 使用服務(wù)器發(fā)送事件 (SSE) 進(jìn)行通信
TransportTypes.WebSocket
- 使用 WebSocket 進(jìn)行通信
工具調(diào)用
連接到服務(wù)器后,客戶(hù)端可以列出可用的工具并調(diào)用它們:
var tools = await mcpClient.ListToolsAsync(); foreach (var tool in tools) { Console.WriteLine($"Connected to server with tools: {tool.Name}"); } // 調(diào)用工具示例 var result = await mcpClient.CallToolAsync( "echo", new Dictionary() { ["message"] = "Hello MCP!" }, CancellationToken.None); // 輸出結(jié)果 Console.WriteLine(result.Content.First(c => c.Type == "text").Text);
工具調(diào)用參數(shù)說(shuō)明: toolName
- 要調(diào)用的工具名稱(chēng)
parameters
- 工具參數(shù)字典,鍵為參數(shù)名,值為參數(shù)值
cancellationToken
- 取消令牌,用于取消操作
結(jié)果處理:
工具調(diào)用結(jié)果包含一個(gè) Content
集合,每個(gè)內(nèi)容項(xiàng)都有一個(gè) Type
和一個(gè) Text
。常見(jiàn)的內(nèi)容類(lèi)型包括:
text
- 純文本內(nèi)容
application/json
- JSON 格式的內(nèi)容
image/*
- 圖像內(nèi)容(如 image/png、image/jpeg 等)
與 Claude 模型集成
MCP 客戶(hù)端可以與 Claude 等 AI 模型集成,使模型能夠使用 MCP 工具:
var anthropicClient = new AnthropicClient(new APIAuthentication(builder.Configuration["ANTHROPIC_API_KEY"])) .Messages .AsBuilder() .UseFunctionInvocation() .Build(); var options = new ChatOptions { MaxOutputTokens = 1000, ModelId = "claude-3-5-sonnet-20240229", Tools = [.. tools] }; // 使用 Claude 模型處理用戶(hù)查詢(xún) await foreach (var message in anthropicClient.GetStreamingResponseAsync(query, options)) { Console.Write(message); }
集成步驟說(shuō)明:
- 創(chuàng)建 Anthropic 客戶(hù)端并配置 API 密鑰
- 啟用函數(shù)調(diào)用功能
- 創(chuàng)建聊天選項(xiàng),包括模型 ID、最大輸出令牌數(shù)和工具列表
- 使用流式響應(yīng) API 處理用戶(hù)查詢(xún)
- 處理模型返回的消息,包括工具調(diào)用和文本響應(yīng)
Cursor 配置與集成
MCP Server 添加步驟
在 Cursor 中配置 MCP Server 的步驟如下:
- 導(dǎo)航至
Cursor Settings
>Features
>MCP
- 點(diǎn)擊
+ Add New MCP Server
按鈕 - 在配置窗口中:
- 選擇傳輸類(lèi)型
- 配置服務(wù)器信息
- 完成添加后,服務(wù)器將顯示在 MCP 服務(wù)器列表中
- 如需更新工具列表,可能需要手動(dòng)點(diǎn)擊刷新按鈕
Cursor MCP 服務(wù)器配置界面示例
傳輸類(lèi)型配置
Cursor 支持兩種主要的傳輸類(lèi)型:
stdio
用于標(biāo)準(zhǔn)輸入輸出通信,適用于本地運(yùn)行的 MCP 服務(wù)器。
配置方式:輸入可執(zhí)行命令
示例:
npx -y @smithery/cli@latest run @mzxrai/mcp-webresearch --config "{}"
sse
用于服務(wù)器發(fā)送事件通信,適用于遠(yuǎn)程 MCP 服務(wù)器。
配置方式:輸入服務(wù)器 URL
示例:
https://example.com/mcp
工具使用方法
在 Cursor 的 Composer 中使用 MCP 工具時(shí),你可以:
- 讓 Composer Agent 自動(dòng)選擇合適的工具
- 明確指定使用特定工具
- 查看工具調(diào)用的詳細(xì)信息
- 對(duì)工具調(diào)用進(jìn)行管理:
- 檢查調(diào)用參數(shù)
- 決定是否批準(zhǔn)調(diào)用
- 查看調(diào)用結(jié)果
工具使用示例:
用戶(hù): 搜索關(guān)鍵詞 cursor mcp server,列出 Top 5 熱度的關(guān)鍵詞
Claude: 我將使用 Web Search 工具來(lái)搜索這些關(guān)鍵詞。
工具調(diào)用:Web Search 參數(shù):{"query": "cursor mcp server"}
Claude: 根據(jù)搜索結(jié)果,關(guān)于 "cursor mcp server" 的 Top 5 熱度關(guān)鍵詞是:
Model Context Protocol (MCP) Integration
Custom MCP Server Development
MCP Server Templates
Database Integration
Desktop Application Integration
最佳實(shí)踐與示例
服務(wù)器端最佳實(shí)踐
使用依賴(lài)注入:
利用 .NET 的依賴(lài)注入系統(tǒng)管理服務(wù)和工具的依賴(lài)關(guān)系。
適當(dāng)?shù)腻e(cuò)誤處理:
確保工具實(shí)現(xiàn)中包含適當(dāng)?shù)腻e(cuò)誤處理邏輯。
詳細(xì)的工具描述:
使用Description
特性為工具和參數(shù)提供清晰的描述。
模塊化設(shè)計(jì):
將不同功能的工具分組到不同的類(lèi)中。
客戶(hù)端最佳實(shí)踐
異步操作:
使用異步方法處理 MCP 客戶(hù)端的所有操作。
資源管理:
確保適當(dāng)釋放客戶(hù)端資源。
錯(cuò)誤處理:
實(shí)現(xiàn)適當(dāng)?shù)腻e(cuò)誤處理邏輯,處理服務(wù)器連接和工具調(diào)用中可能出現(xiàn)的問(wèn)題。
用戶(hù)體驗(yàn):
提供清晰的用戶(hù)反饋,特別是在工具調(diào)用過(guò)程中。
集成示例
以下是一個(gè)將 MCP 客戶(hù)端與 Claude 模型集成的完整示例:
using Anthropic.SDK; using Microsoft.Extensions.AI; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using ModelContextProtocol.Client; using ModelContextProtocol.Protocol.Transport; using System.ComponentModel; var builder = Host.CreateApplicationBuilder(args); builder.Configuration .AddEnvironmentVariables() .AddUserSecrets(); var (command, arguments) = GetCommandAndArguments(args); await using var mcpClient = await McpClientFactory.CreateAsync(new() { Id = "demo-server", Name = "Demo Server", TransportType = TransportTypes.StdIo, TransportOptions = new() { ["command"] = command, ["arguments"] = arguments, } }); var tools = await mcpClient.ListToolsAsync(); foreach (var tool in tools) { Console.WriteLine($"Connected to server with tools: {tool.Name}"); } var anthropicClient = new AnthropicClient(new APIAuthentication(builder.Configuration["ANTHROPIC_API_KEY"])) .Messages .AsBuilder() .UseFunctionInvocation() .Build(); var options = new ChatOptions { MaxOutputTokens = 1000, ModelId = "claude-3-5-sonnet-20240229", Tools = [.. tools] }; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("MCP Client Started!"); Console.ResetColor(); PromptForInput(); while(Console.ReadLine() is string query && !("exit".Equals(query, StringComparison.OrdinalIgnoreCase))) { if (string.IsNullOrWhiteSpace(query)) { PromptForInput(); continue; } await foreach (var message in anthropicClient.GetStreamingResponseAsync(query, options)) { Console.Write(message); } Console.WriteLine(); PromptForInput(); } static void PromptForInput() { // 提示用戶(hù)輸入 } static (string, string) GetCommandAndArguments(string[] args) { // 解析命令行參數(shù) }
這個(gè)示例展示了如何創(chuàng)建 MCP 客戶(hù)端,連接到服務(wù)器,獲取可用工具,并將這些工具與 Claude 模型集成,使模型能夠使用這些工具來(lái)響應(yīng)用戶(hù)查詢(xún)。
結(jié)論
本文檔詳細(xì)介紹了 .NET 使用 MCP 的相關(guān)內(nèi)容,包括服務(wù)器端實(shí)現(xiàn)、客戶(hù)端實(shí)現(xiàn)以及 Cursor 集成配置等方面。通過(guò)使用 MCP,開(kāi)發(fā)者可以創(chuàng)建強(qiáng)大的工具和服務(wù),使 AI 模型能夠安全地訪(fǎng)問(wèn)和操作各種數(shù)據(jù)源。
隨著 MCP 生態(tài)系統(tǒng)的不斷發(fā)展,我們可以期待更多的功能和改進(jìn)。官方的 C# SDK 提供了一個(gè)穩(wěn)定的基礎(chǔ),使 .NET 開(kāi)發(fā)者能夠輕松地實(shí)現(xiàn) MCP 服務(wù)器和客戶(hù)端。
我們鼓勵(lì)開(kāi)發(fā)者探索 MCP 的各種可能性,創(chuàng)建創(chuàng)新的工具和服務(wù),并為 MCP 社區(qū)做出貢獻(xiàn)。
到此這篇關(guān)于.NET MCP 文檔的文章就介紹到這了,更多相關(guān).NET MCP 文檔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 教你如何實(shí)現(xiàn)容器化 MCP Server
- 輕松開(kāi)發(fā) Streamable HTTP MCP Server
- 在 VS Code 中,一鍵安裝 MCP Server!
- 從零開(kāi)始開(kāi)發(fā)一個(gè) MCP Server!
- VS?Code擴(kuò)展Code?Runner?MCP?Server來(lái)了
- Go語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)查詢(xún)IP信息的MCP服務(wù)器
- 一文弄懂用Go實(shí)現(xiàn)MCP服務(wù)的示例代碼
- 一文帶你學(xué)會(huì)使用Go語(yǔ)言實(shí)現(xiàn)自己的MCP服務(wù)端
- SpringBoot項(xiàng)目引入MCP的實(shí)現(xiàn)示例
- 把 MCP Server 打包進(jìn) VS Code extension
相關(guān)文章
ASP.NET漢字轉(zhuǎn)拼音 - 輸入漢字獲取其拼音的具體實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET漢字轉(zhuǎn)拼音 - 輸入漢字獲取其拼音的具體實(shí)現(xiàn),需要的朋友可以參考下2014-02-02asp.net網(wǎng)站開(kāi)發(fā)包wq.dll打包下載
這個(gè)wq.dll主要是用來(lái)給Web群和C#聯(lián)盟群及GUI群的朋友使用的,其它群和使用控件開(kāi)發(fā)web的朋友可以直接無(wú)視,這個(gè)封裝好的包是一個(gè)基礎(chǔ)開(kāi)發(fā)包,可以輕松的幫你完成一些小型網(wǎng)站的開(kāi)發(fā),支持.Net Framework2.0(及以上平臺(tái))。2009-10-10使用vs2019加.net core 對(duì)WeiApi的創(chuàng)建過(guò)程詳解
這篇文章主要介紹了使用vs2019加.net core 對(duì)WeiApi的創(chuàng)建,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07asp.net后臺(tái)動(dòng)態(tài)添加JS文件和css文件的引用實(shí)現(xiàn)方法
這篇文章主要介紹了asp.net后臺(tái)動(dòng)態(tài)添加JS文件和css文件的引用實(shí)現(xiàn)方法,是非常簡(jiǎn)單實(shí)用的技巧,需要的朋友可以參考下2014-09-09