1.簡單介紹
MCP是Model Context Protocol的縮寫,是Anthropic開源的一個標準協議。MCP使得大語言模型可以和外部的數據源,工具進行集成。當前MCP在社區逐漸地流行起來了。同時official C# SDK(倉庫是csharp-sdk)?也在不斷更新中,目前最新版本是0.1.0-preview.7,相對之前的版本還是在不斷更新的(發現最新版的McpClientFactory.CreateAsync方法好像有變更)。關于MCP的具體信息可以參考官方網站。
MCP使用的是client-server架構,下圖為官網上面的一張圖片
????????
目前MCP client和MCP server交互使用的TransportType有兩種,一種是Stdio(標準輸入輸出),另外一種是SSE(Server Sent Event),http目前還未支持。在集成本地command-line tool或者Shell腳本場景方面,Stdio可能適合些。SSE支持Server-to-Client streaming。
????????
????????
這邊簡單嘗試一個MCP server去獲取Microsoft 365 Planner中的Plan, Task信息,然后使用MCP Inspector去調用一下看看,
2.具體說明
2.1 準備階段
假定存在一個Microsoft 365 Planner
????????
在Microsoft 365 Planer中,一個Microsoft 365 Group對應多個Plan, 一個Plan對應多個Task的。
2.2?創建WebApi項目
1) 創建一個基于.NET9的Asp.NET Core WebApi項目
2) 添加nuget package?ModelContextProtocol.AspNetCore (版本是0.1.0-preview.7)?
? ? 添加了這個package,就不需要再為IEndpointRouteBuilder添加拓展方法了(MapMcpSse)
3)由于要獲取Microsoft 365 Planer的信息,需要使用Microsfot Graph Rest Api,添加一下Microsoft Graph nuget package
????????
?4) program.cs的代碼如下
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMcpServer().WithToolsFromAssembly();
var app = builder.Build();
app.MapMcp();
app.Run();
note, 其中WithToolsFromAssembly方法會掃描程序集當中標注了[McpServerToolType] attribute的類進行注冊的
?5)在項目中添加一個Tools文件夾,然后添加一個靜態類
????????
[McpServerToolType]
public static class M365PlannerInfoQueryTool
{...[McpServerTool, Description("List the Microsoft 365 Groups the user belong to")]public static string[] ListAllGroupsTheUserBelongTo(){...GraphServiceClient graphClient = _appClient!;var groupResponse = graphClient?.Groups.GetAsync().Result;var groups = groupResponse?.Value;List<string> groupList = new List<string>();foreach (var group in groups!){Console.WriteLine($"Group Display Name: {group.DisplayName} - Group Id: {group.Id}");groupList.Add($"Group Name: {group.DisplayName} - Group Id: {group.Id}");}return groupList.ToArray();}...
}
2.3 運行一下
運行項目后,這邊得到的地址是http://localhost:5266
????????
2.4 使用MCP Inspector測試
1) 在命令行中運行 npx @modelcontextprotocol/inspector
2) 在打開的MCP Inspector界面中,設定Transport Type為SSE,URL為之前運行起來的MCP Server地址http://localhost:5266/sse,點擊Connect
????????
連接成功之后的界面如下
????????
3)點擊? MCP Inspector界面右側的List Tools按鈕
????????
發現MCP Server中有標注[McpServerTool] attribute的方法被列出來了,
????????
4)點擊第一個Tool - ListAllGroupsTheUserBelongTo,界面變成如下的樣子
????????
5)點擊最右側的Run Tool按鈕,發現確實有結果返回,也就是MCP Server的方法被調用了
?????????? ?
有了MCP Server之后,就可以在MCP Client中進行調用了, 在MCP Client中,可以結合大語言模型的能力進行MCP Server的 tool的調用。其實MCP使用也是基于Function Calling的。
假定嘗試一下將MCP Client和GitHub Copilot extension結合起來(使用LLM),則運行效果如下
????????
后續將會嘗試一下在MCP Client中使用Semantic Kernel或者Microsoft.Extensions.AI。
3.總結
本文簡單介紹了一下MCP的一些知識以及如何創建一個MCP Server。創建好的MCP Server也可以在VS Code中進行配置。配置好后,在GitHub Copilot界面中添加對應的tool,后續就可以基于自然語言進行tool的調用了。
本文如果哪里有錯誤,麻煩告之,謝謝謝謝!