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);
}
集成步驟說明:
-
創建 Anthropic 客戶端并配置 API 密鑰
-
啟用函數調用功能
-
創建聊天選項,包括模型 ID、最大輸出令牌數和工具列表
-
使用流式響應 API 處理用戶查詢
-
處理模型返回的消息,包括工具調用和文本響應
Cursor 配置與集成
MCP Server 添加步驟
在 Cursor 中配置 MCP Server 的步驟如下:
-
導航至?
Cursor Settings
?>?Features
>?MCP
-
點擊
+ Add New MCP Server
按鈕 -
在配置窗口中:
-
選擇傳輸類型
-
配置服務器信息
-
-
完成添加后,服務器將顯示在 MCP 服務器列表中
-
如需更新工具列表,可能需要手動點擊刷新按鈕
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 熱度關鍵詞是:
-
Model Context Protocol (MCP) Integration
-
Custom MCP Server Development
-
MCP Server Templates
-
Database Integration
-
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 社區做出貢獻。