MCP出来有段时间了,最近用ASP.NET Core API加上MCP ASP.NET Core nuget extension实现了一个Steamable Http MCP,然后通过TRAE来调用MCP。

开发工具:

  1. Visual Studio Community 2022 - 开发MCP。Visual Studio: IDE and Code Editor for Software Development
  2. 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特定场景下的功能,使大模型更高效。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐