ASP.NET Core实现MCP Streamable HTTP
本文介绍了使用ASP.NET Core API和MCP ASP.NET Core NuGet扩展实现Steamable HTTP MCP的过程。主要内容包括:1)创建基础API项目并添加MCP相关NuGet包;2)修改Program.cs文件配置MCP服务和HTTP客户端;3)创建包含两个MCP工具(HelloWorld示例和天气警报查询)的Tool类;4)在TRAE中配置MCP服务器并测试交互。
MCP出来有段时间了,最近用ASP.NET Core API加上MCP ASP.NET Core nuget extension实现了一个Steamable Http MCP,然后通过TRAE来调用MCP。
开发工具:
- Visual Studio Community 2022 - 开发MCP。Visual Studio: IDE and Code Editor for Software Development
- TRAE - 测试MCP。IDE & AI 编程助手 | TRAE - The Real AI Engineer
开发步骤:
1. 创建一个ASP.NET Core Web API project。

2. 注意这里,暂时什么都不要勾选。只是为了测试通过,实际开发产品中,可能要配置其他选项。然后点击创建即可。

3. 这里会创建一个普通的ASP.NET Core API项目,可以F5跑起来测试API是否可以正常运行。正常运行这里会调用一个天气的示例,并返回JSON格式结果。
4. 然后我们开始添加MCP所需要的SDK,也就是Nuget包。右键项目,从右键菜单中选择管理Nuget程序包。点击浏览,在搜索框填入modelcontextprotocol,过滤Nuget包。注意,这里一定要把包括预发行版勾上!因为ModelContextProtocol.AspNetCore还是预发行版本。添加完毕,项目中就能使用MCP相关的服务了。

5. 然后我们要开始改几个文件。
5.1 Program.cs
using HelloWorldMcp.Tools;
using System.Net.Http.Headers;
var builder = WebApplication.CreateBuilder(args);
// 添加MCP Service
builder.Services.AddMcpServer().WithHttpTransport().WithTools<HelloWorldTool>();
// 添加HTTP Service, MCP Tool中会使用
builder.Services.AddHttpClient("WeatherApi", client =>
{
client.BaseAddress = new Uri("https://api.weather.gov/");
client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("weather-tool", "1.0"));
});
var app = builder.Build();
app.MapMcp();
app.Run();
5.2 加一个Tool文件夹,下面创建一个HelloWorldTool.cs
这个类里包含了两个MCP tools,是通过McpServerTool属性标记的,同时Description属性里,说明这个Tool是什么功能,接受什么样的参数等等。
一个Tool是GetHelloWorld,返回一串字符,没有实际的功能,是为了展示MCP tool。
一个Tool是GetAlerts,这个Tool接收两个字母的城市代号码为参数,然后调用https://api.weather.gov/,获得该城市天气警报信息。
public class HelloWorldTool(IHttpClientFactory httpClientFactory)
{
[McpServerTool, Description("Hello world from Streamable Http tool")]
public string GetHelloWorld()
{
return "Hello world from Streamable Http tool.";
}
[McpServerTool, Description("This tool returns alerts from the https://api.weather.gov/ API based on the state code")]
public async Task<List<WeatherAlert>> GetAlerts([Description("2 characters state code for example NY")] string stateCode)
{
var client = httpClientFactory.CreateClient("WeatherApi");
using var response = await client.GetStreamAsync($"/alerts/?area={stateCode}&limit=10");
using var doc = await JsonDocument.ParseAsync(response) ?? throw new McpException("No JSON returned from the alerts endpoint");
var features = doc.RootElement.GetProperty("features").EnumerateArray();
if (features.Any() == false)
{
return [];
}
var alerts = features.Select(f => new WeatherAlert
{
Event = f.GetProperty("properties").GetProperty("event").GetString() ?? string.Empty,
AreaDesc = f.GetProperty("properties").GetProperty("areaDesc").GetString() ?? string.Empty,
Severity = f.GetProperty("properties").GetProperty("severity").GetString() ?? string.Empty,
Description = f.GetProperty("properties").GetProperty("description").GetString() ?? string.Empty
}
).ToList();
return alerts;
}
}
5.3 还有一个WeatherAlert.cs,这是Model,用于反序列化调用API返回的JSON。
public class WeatherAlert
{
public string Event { get; set; }
public string AreaDesc { get; set; }
public string Severity { get; set; }
public string Description { get; set; }
}
5.4 整个项目结构看起来是这样

6. 编译,运行
这个时候,因为我们把原来的API代码部分删除了,所以,这个时候API调用是返回404。但这个时候,我们的MCP Server已经运行了。注意这里的http://localhost:5295,下面我们要把这个地址,配置在TRAE的mcp.json。


7. 接下来,我们要在TRAE里配置MCP,并且测试MCP Server。为什么用TRAE,这个在国内没有任何限制,下载下来,不要复杂配置,就可以直接使用。
7.1 点击TRAE的右上角的设置按钮,找到MCP。

7.2 点击手动添加,然后点击原始配置,在打开的mcp.json里,输入如下配置。这里的url是步骤6里运行起来,获得的url。
{
"mcpServers": {
"helloworld_mcp": {
"url": "http://localhost:5295"
}
}
}
7.3 添加正确的话,你会在MCP这里看到你新添加的MCP。MCP会自动连接,你在ASP.NET Core的控制台,可以看到连接的Log。同样的,如果你这里连接出现了问题,也可以从Log中看到异常Log。


8. 和MCP Server交互,这里注意,我们要选择为Builder with MCP。这样他才会去选择MCP Tools,否则,他会直接使用常规大模型回答,跳过MCP tools。当选择Builder with MCP时,我们也会看到helloworld_mcp,也就是我们刚添加的MCP。

8.1 我提问 Hello world from Steamable Http tool,我们看到大模型能找到对应的MCP tool,并正确执行。这个注意一下,如果你是第一次提问,可能会遇到让你同意运行的提示,点击同意继续。

8.2 我提问,查询纽约的天气警报。这里即使我是用中文提问的,大语言模型也能转化。我们看到它成功找到MCP Tool,并且转化纽约的两个字母的州代码。这里API返回的其实是英文。但最终返回给我的结果是中文。这就是大模型的神奇之处,他能了解上下文,然后返回最匹配的结果。


9. 至此,MCP服务测试完成。
总结:
Steamable HTTP形式的MCP,实际上是在ASP.NET Core API外层包装了MCP,这样大模型可以理解Tools的功能和调用方式。这里MCP Tool的描述和参数的描述至关重要,他是大模型选择的依据。利用MCP,我们能扩展大模型的能力,customize特定场景下的功能,使大模型更高效。
更多推荐



所有评论(0)