.NET MCP 文檔

MCP 概述

MCP(Model Context Protocol)是由 Anthropic 推出的一種開放協議,類似 AI 的 USB-C 擴展塢,用于在大模型和數據源之間建立安全的通信(授權),讓 AI 應用能夠安全地訪問和操作本地或遠程數據,例如操作本地文件、瀏覽器和 Web 服務。

為了更好地理解 MCP,我們可以用一個簡單的類比:如果把 AI 比作電腦主機,那么 MCP 就相當于 USB 協議,而 MCP Server 則類似于各種 USB 設備(如攝像頭、麥克風等)。通過實現 MCP Server,我們可以讓 AI 輕松連接到各種數據源,大大擴展其功能范圍。

MCP 協議的核心價值在于標準化了 AI 模型與外部工具和數據源的交互方式,使開發者能夠創建可被多種 AI 應用程序使用的工具和服務。這種標準化的接口極大地簡化了 AI 應用的開發過程,并提高了工具和服務的可重用性。

MCP 的主要特點

  • 標準化的工具調用接口

  • 安全的雙向通信

  • 支持多種傳輸方式(stdio、SSE、WebSocket 等)

  • 豐富的數據類型支持

  • 與主流 LLM 的無縫集成

  • 跨平臺和跨語言支持

MCP 服務器

MCP 服務器是實現 MCP 協議的服務端,負責注冊和提供工具,處理客戶端的工具調用請求,并返回結果。服務器可以使用多種傳輸方式與客戶端通信,如標準輸入輸出、SSE 或 WebSocket。

MCP 客戶端

MCP 客戶端是實現 MCP 協議的客戶端,負責連接到 MCP 服務器,獲取可用工具列表,調用工具,并處理返回結果。客戶端通常與 LLM 集成,使 LLM 能夠使用 MCP 工具。

.NET MCP 實現項目對比

在 .NET 生態系統中,目前有幾個主要的 MCP 實現項目,它們各有特點。以下是這些項目的對比分析:

官方 C# SDK:csharp-sdk

這是 Model Context Protocol(MCP)官方提供的 C# SDK,為 MCP 服務器和客戶端提供簡單易用的接口,主要由微軟維護。該項目已經成為 MCP 社區的官方 SDK 項目,最近發布了 0.1.0-preview 版本。

GitHub 倉庫:?

https://github.com/modelcontextprotocol/csharp-sdk

MCPSharp

MCPSharp 是一個 .NET 庫,旨在幫助開發者構建 Model Context Protocol(MCP)服務器和客戶端。它提供了創建 MCP 合規的工具和函數、連接現有 MCP 服務器、將 .NET 方法暴露為 MCP 端點、處理 MCP 協議細節和 JSON-RPC 通信等功能。

特點:
  • 與 Microsoft.Extensions.AI 集成

  • Semantic Kernel 支持

  • 動態工具注冊

  • 工具變更通知

  • 復雜對象參數支持

  • 錯誤處理

  • 易用的基于屬性的 API

  • 內置 JSON-RPC 支持

  • 自動參數驗證和類型轉換

GitHub 倉庫:?

https://github.com/afrise/MCPSharp

mcpdotnet

mcpdotnet 是一個 .NET 實現的模型上下文協議(MCP),使 .NET 應用程序能夠與 MCP 客戶端和服務器進行交互。該項目已經進入歸檔狀態,相關的開發工作都集中到了官方的 csharp-sdk。

特點:
  • 支持多種 MCP 功能

  • 遵循規范的實現

  • 提供全面的日志支持

  • 兼容 .NET 8.0 及以上版本

GitHub 倉庫:?

https://github.com/PederHP/mcpdotnet

ModelContextProtocol.NET

ModelContextProtocol.NET 是一個 C# SDK,實現了模型上下文協議(MCP)。

特點:
  • 標準輸入輸出通信

  • 工具集成框架

  • 原生 AOT 兼容

  • 計算器演示實現

  • 開發中功能:WebSocket 支持、資源管理和提示系統

GitHub倉庫:

https://github.com/salty-flower/ModelContextProtocol.NET

服務器端實現

基本結構

使用官方的 C# SDK (csharp-sdk) 實現 MCP 服務器的基本結構如下:

這段代碼展示了如何創建一個基本的 MCP 服務器,它使用標準輸入輸出(stdio)作為傳輸方式,并自動注冊當前程序集中的所有工具。

關鍵組件說明:
  • AddMcpServer()

    ?- 向依賴注入容器添加 MCP 服務器服務

  • WithStdioServerTransport()

    ?- 配置服務器使用標準輸入輸出作為傳輸方式

  • WithToolsFromAssembly()

    ?- 自動注冊當前程序集中的所有 MCP 工具

工具注冊與實現

在 MCP 服務器中,工具是通過特性(Attribute)來注冊的。下面是一個簡單的工具實現示例:

[McpServerToolType]
public?static?class?EchoTool
{[McpServerTool, Description("Echoes the message back to the client.")]public?static?string?Echo(string?message)?=>?$"hello?{message}";
}

更復雜的工具可以使用依賴注入和服務器交互:

在 QuickstartWeatherServer 示例中,我們可以看到更實際的工具實現:

[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()}""";}));}
}

工具注冊特性說明:
  • [McpServerToolType]

    ?- 標記一個類包含 MCP 工具

  • [McpServerTool]

    ?- 標記一個方法作為 MCP 工具

  • [Description]

    ?- 提供工具和參數的描述信息

服務配置

MCP 服務器的配置主要通過 .NET 的依賴注入系統完成。以下是一個配置 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;
});

????

高級配置選項:
  • 自定義傳輸方式:除了標準的 stdio 傳輸方式,還可以配置 SSE 或 WebSocket 傳輸

  • 工具過濾:可以選擇性地注冊特定的工具,而不是注冊所有工具

  • 中間件:可以添加自定義中間件來處理請求和響應

  • 錯誤處理:可以配置全局錯誤處理策略

  • 日志記錄:可以配置詳細的日志記錄選項

客戶端實現

連接到 MCP 服務器

使用官方的 C# SDK 連接到 MCP 服務器的基本代碼如下:???????

var?mcpClient =?await?McpClientFactory.CreateAsync(new()
{Id?=?"demo-server",Name?=?"Demo Server",TransportType?=?TransportTypes.StdIo,TransportOptions?=?new(){["command"] = command,["arguments"] =?arguments,}
});

這段代碼創建了一個 MCP 客戶端,并連接到指定的服務器。TransportType?指定了通信方式(這里是標準輸入輸出),TransportOptions?提供了額外的配置選項。

支持的傳輸類型:
  • TransportTypes.Stdio

    ?- 使用標準輸入輸出進行通信

  • TransportTypes.Sse

    ?- 使用服務器發送事件 (SSE) 進行通信

  • TransportTypes.WebSocket

    ?- 使用 WebSocket 進行通信

工具調用

連接到服務器后,客戶端可以列出可用的工具并調用它們:???????

var?tools =?await?mcpClient.ListToolsAsync();
foreach?(var?tool?in?tools)
{Console.WriteLine($"Connected to server with tools:?{tool.Name}");
}
// 調用工具示例
var?result =?await?mcpClient.CallToolAsync("echo",new?Dictionary() { ["message"] =?"Hello MCP!"?},CancellationToken.None);
// 輸出結果
Console.WriteLine(result.Content.First(c => c.Type ==?"text").Text);

???????

工具調用參數說明:
  • toolName

    ?- 要調用的工具名稱

  • parameters

    ?- 工具參數字典,鍵為參數名,值為參數值

  • cancellationToken

    ?- 取消令牌,用于取消操作

結果處理:

工具調用結果包含一個?Content?集合,每個內容項都有一個?Type?和一個?Text。常見的內容類型包括:

  • text

    ?- 純文本內容

  • application/json

    ?- JSON 格式的內容

  • image/*

    ?- 圖像內容(如 image/png、image/jpeg 等)

與 Claude 模型集成

MCP 客戶端可以與 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 模型處理用戶查詢
await foreach (var message in anthropicClient.GetStreamingResponseAsync(query, options))
{Console.Write(message);
}

集成步驟說明:
  1. 創建 Anthropic 客戶端并配置 API 密鑰

  2. 啟用函數調用功能

  3. 創建聊天選項,包括模型 ID、最大輸出令牌數和工具列表

  4. 使用流式響應 API 處理用戶查詢

  5. 處理模型返回的消息,包括工具調用和文本響應

Cursor 配置與集成

MCP Server 添加步驟

在 Cursor 中配置 MCP Server 的步驟如下:

  1. 導航至?Cursor Settings?>?Features>?MCP

  2. 點擊+ Add New MCP Server按鈕

  3. 在配置窗口中:

    • 選擇傳輸類型

    • 配置服務器信息

  4. 完成添加后,服務器將顯示在 MCP 服務器列表中

  5. 如需更新工具列表,可能需要手動點擊刷新按鈕

Cursor MCP 服務器配置界面示例

圖片

傳輸類型配置

Cursor 支持兩種主要的傳輸類型:

stdio

用于標準輸入輸出通信,適用于本地運行的 MCP 服務器。

配置方式:輸入可執行命令
示例:

npx?-y?@smithery/cli@latest?run?@mzxrai/mcp-webresearch --config?"{}"
sse

用于服務器發送事件通信,適用于遠程 MCP 服務器。

配置方式:輸入服務器 URL
示例:

https://example.com/mcp

工具使用方法

在 Cursor 的 Composer 中使用 MCP 工具時,你可以:

  • 讓 Composer Agent 自動選擇合適的工具

  • 明確指定使用特定工具

  • 查看工具調用的詳細信息

  • 對工具調用進行管理:

    • 檢查調用參數

    • 決定是否批準調用

    • 查看調用結果

工具使用示例:

用戶:?搜索關鍵詞 cursor mcp server,列出 Top 5 熱度的關鍵詞

Claude:?我將使用 Web Search 工具來搜索這些關鍵詞。???????

工具調用:Web?Search參數:{"query":?"cursor mcp server"}

Claude:?根據搜索結果,關于 "cursor mcp server" 的 Top 5 熱度關鍵詞是:

  1. Model Context Protocol (MCP) Integration

  2. Custom MCP Server Development

  3. MCP Server Templates

  4. Database Integration

  5. Desktop Application Integration

最佳實踐與示例

服務器端最佳實踐

  • 使用依賴注入:

    利用 .NET 的依賴注入系統管理服務和工具的依賴關系。

  • 適當的錯誤處理:

    確保工具實現中包含適當的錯誤處理邏輯。

  • 詳細的工具描述:

    使用Description特性為工具和參數提供清晰的描述。

  • 模塊化設計:

    將不同功能的工具分組到不同的類中。

客戶端最佳實踐

  • 異步操作:

    使用異步方法處理 MCP 客戶端的所有操作。

  • 資源管理:

    確保適當釋放客戶端資源。

  • 錯誤處理:

    實現適當的錯誤處理邏輯,處理服務器連接和工具調用中可能出現的問題。

  • 用戶體驗:

    提供清晰的用戶反饋,特別是在工具調用過程中。

集成示例

以下是一個將 MCP 客戶端與 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()
{// 提示用戶輸入
}
static (string, string) GetCommandAndArguments(string[] args)
{// 解析命令行參數
}

這個示例展示了如何創建 MCP 客戶端,連接到服務器,獲取可用工具,并將這些工具與 Claude 模型集成,使模型能夠使用這些工具來響應用戶查詢。

結論

本文檔詳細介紹了 .NET 使用 MCP 的相關內容,包括服務器端實現、客戶端實現以及 Cursor 集成配置等方面。通過使用 MCP,開發者可以創建強大的工具和服務,使 AI 模型能夠安全地訪問和操作各種數據源。

隨著 MCP 生態系統的不斷發展,我們可以期待更多的功能和改進。官方的 C# SDK 提供了一個穩定的基礎,使 .NET 開發者能夠輕松地實現 MCP 服務器和客戶端。

我們鼓勵開發者探索 MCP 的各種可能性,創建創新的工具和服務,并為 MCP 社區做出貢獻。

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

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

相關文章

【Linux】vim配置----超詳細

目錄 一、插件管理器準備 二、目錄準備 三、安裝插件 一、插件管理器準備 Vim-plug 是一個Vim插件管理器,利用異步并行可以快速地安裝、更新和卸載插件。它的安裝和配置都非常簡單,而且在操作過程中會給出很多易讀的反饋信息,是一個自由、…

PHP實現圖片自動添加水印效果

<?php // 設置原始圖片路徑和水印圖片路徑 $original_image original.jpg; $watermark_image watermark.png;// 創建圖片資源 $original imagecreatefromjpeg($original_image); $watermark imagecreatefrompng($watermark_image);// 獲取圖片尺寸 $original_width im…

檢查新接手LINUX服務器應用的部署情況和正在運行的服務

當接手一臺新的 Linux 服務器時&#xff0c;第一要務就是摸清系統上已經安裝部署了哪些應用和服務。 本文將以 CentOS7為例&#xff0c;詳細介紹如何系統地排查已安裝的應用和服務&#xff0c;包括它們的安裝方式和安裝位置。 1.查看系統基本信息 首先獲取系統整體信息&…

使用注解方式整合ssm時,啟動tomcat掃描不到resource下面的xxxmapper.xml問題,解決方法

解決org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.方法 在Spring與Mybatis整合時&#xff0c;可能會遇到這樣的報錯 原因&#xff1a; 其原因為mapper路徑的映射錯誤&#xff0c;表示在嘗試執行某個 Mapper 接口的方法時…

C++11特性補充

目錄 lambda表達式 定義 捕捉的方式 可變模板參數 遞歸函數方式展開參數包 數組展開參數包 移動構造和移動賦值 包裝器 綁定bind 智能指針 RAII auto_ptr unique_ptr shared_ptr 循環引用 weak_ptr 補充 總結 特殊類的設計 不能被拷貝的類 只能在堆上創建…

My SQL 索引

核心目標&#xff1a; 理解 mysql 索引的工作原理、類型、優缺點&#xff0c;并掌握創建、管理和優化索引的方法&#xff0c;以顯著提升數據庫查詢性能。 什么是索引&#xff1f; 索引是一種特殊的數據庫結構&#xff0c;它包含表中一列或多列的值以及指向這些值所在物理行的指…

極狐GitLab 注冊限制如何設置?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 注冊限制 (BASIC SELF) 您可以對注冊實施以下限制&#xff1a; 禁用新注冊。新注冊需要管理員批準。需要用戶電子郵件確認。…

10.(vue3.x+vite)div實現tooltip功能(css實現)

1:效果截圖 2:代碼實現 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;

Linux下 文件的查找、復制、移動和解壓縮

1、在/var/log目錄下創建一個hehe.log的文件&#xff0c;其文件內容是&#xff1a; myhostname ghl mydomain localdomain relayhost [smtp.qq.com]:587 smtp_use_tls yes smtp_sasl_auth_enable yes smtp_sasl_security_options noanonymous smtp_sasl_tls_security_opt…

Ubuntu 安裝 Docker 教程(官方推薦方式)

? 步驟 1&#xff1a;卸載舊版本&#xff08;如果有&#xff09; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ? 步驟 2&#xff1a;更新 APT 索引并安裝依賴項bash sudo a…

計算機視覺與深度學習 | Transformer原理,公式,代碼,應用

Transformer 詳解 Transformer 是 Google 在 2017 年提出的基于自注意力機制的深度學習模型,徹底改變了序列建模的范式,解決了 RNN 和 LSTM 在長距離依賴和并行計算上的局限性。以下是其原理、公式、代碼和應用的詳細解析。 一、原理 核心架構 Transformer 由 編碼器(Encod…

計算機基礎 | 常見進制與單位簡介 / 表示 / 描述

注&#xff1a;本文為 “進制與常見單位應用” 相關文章合輯。 原文為繁體&#xff0c;注意術語描述差異。 略作重排。 進制簡介&#xff08;二進制、八進制、十進制、十六進制&#xff09; 發表于 2017-01-20 鄭中勝 數字系統&#xff08;Numeral system&#xff09;&#…

門面模式與適配器模式

一、門面模式 門面模式&#xff1a;提供統一接口訪問子系統接口 1、包含角色 外觀系統對外的統一接口子系統類的集合&#xff1b;并不知道外觀角色的存在&#xff0c;需要為了配合外觀角色而做特殊處理或修改 2、舉例 原本開關燈要分別操作各個房間的燈&#xff0c;現在設置總…

SpringBoot Actuator指標收集:Micrometer與Prometheus集成

文章目錄 引言一、Spring Boot Actuator基礎二、Micrometer簡介與集成三、基本指標收集與配置四、自定義業務指標實現五、與Prometheus集成六、實戰案例&#xff1a;API性能監控總結 引言 在現代微服務架構中&#xff0c;監控應用程序的健康狀況和性能指標變得至關重要。Sprin…

【Android面試八股文】Android應用進程的啟動流程【二】

應用進程 1.1 Android系統進程的啟動過程&#xff1a; 1、init進程fork出Zygote進程后&#xff0c;Zygote進程會創建一個服務端socket&#xff0c;等待AMS發起socket請求。 同時&#xff0c;由Zygote進程fork出的SystemServer進程會啟動各項系統服務&#xff0c;其中就包含了A…

基于Django的AI客服租車分析系統

基于Django的AI客服租車分析系統 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】AI智能客服與用戶交互指導手冊 【技術棧】 ①&#xff1a;系統環境&#xff1a;Python 3.8&#xff0c;Django 4.2框架 ②&#xff1a;開發環境&a…

全同態加密醫療數據分析集python實現

目錄 摘要一、前言二、全同態加密與醫療數據分析概述2.1 全同態加密(FHE)簡介2.2 醫療數據分析需求三、數據生成與預處理四、系統架構與流程4.1 系統架構圖五、核心數學公式六、異步任務調度與(可選)GPU 加速七、PyQt6 GUI 設計八、完整代碼實現九、自查測試與總結十、展望…

linux 搭建 dvwa 滲透測試環境

linux 安裝 dvwa 1、分為4個部分&#xff0c;搭建dvwa滲透測試環境2、安裝centos 7.63、安裝apache http server4、安裝mysql5、安裝php6、運行dvwa 1、分為4個部分&#xff0c;搭建dvwa滲透測試環境 本文基于centos 7.6 搭建 dvwa 滲透測試環境 安裝一個linux系統安裝apache…

stm32(gpio的四種輸出)

其實GPIO這個片上外設的功能&#xff1a; 用于控制IO引腳。 CPU就如同大腦&#xff0c;而這些片上外設就如同四肢一樣的關系 如圖 —————————————————————————————— OK類比了以上 其實GPIO是有 八種工作模式的 這八種工作模式 因為GPIO是面向IO…

Flask(3): 在Linux系統上部署項目

1 前言 說實話&#xff0c;我并不想接觸linux系統&#xff0c;要記住太多的命令。我更習慣windows系統&#xff0c;鼠標點點&#xff0c;只要記住少量的命令就可以了。 但是我選擇了python&#xff0c;就注定無法逃避linux系統。雖然python也能在windows上很好的運行&#xff0…