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项目
-
创建一个基于.NET9的Asp.NET Core WebApi项目
-
添加nuget package ModelContextProtocol.AspNetCore (版本是0.1.0-preview.7)
添加了这个package,就不需要再为IEndpointRouteBuilder添加拓展方法了(MapMcpSse)
3)由于要获取Microsoft 365 Planer的信息,需要使用Microsfot Graph Rest Api,添加一下Microsoft Graph nuget package

-
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测试
-
在命令行中运行 npx @modelcontextprotocol/inspector
-
在打开的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的调用了。
本文如果哪里有错误,麻烦告之,谢谢谢谢!