.NET 10 dnx 登场,开启 .NET 的 "npx/uvx" 时代

悄悄告诉你🤫,双击屏幕,解锁微信隐藏功能!

紧接上篇,.NET 10 预览版带来了另一项重大更新:NuGet.org 现在支持托管和消费使用 ModelContextProtocol (MCP) C# SDK 构建的 MCP 服务器。这使得 NuGet 从一个主要用于库包管理的平台转变为一个可发现、版本化且易于安装的 MCP 服务分发平台。

其次,.NET 10 预览版引入了 dnx 工具执行脚本。dnx 与 C# MCP 服务的结合,实现了类似 Python uvx 和 Node.js npx 在本地快速启动服务的强大能力。这意味着 C# 开发者也能像 Python 和 Node.js 开发者一样,直接在本地快速启动 AI 服务进行开发和测试,预示着 .NET 10 在 AI 开发领域将大有不同。

MCP + NuGet:AI 服务即包

  • 官方支持:.NET 10 SDK 提供模板 (dotnet new install Microsoft.Extensions.AI.Templates) 和 SDK (ModelContextProtocol),简化 C# MCP 服务器开发。

  • 打包为 .NET Tool:通过在项目文件 (.csproj) 中设置 <PackAsTool>true</PackAsTool> 和 <ToolCommandName>,MCP 服务器可打包为标准的 .NET 工具 NuGet 包。

  • NuGet.org 发现与集成:NuGet.org 新增对 mcpserver 包类型的支持,允许开发者搜索、发现 MCP 服务器。包页面生成 MCP Server 配置说明

  • 声明式配置 (server.json):包内的 .mcp/server.json 清单文件声明服务器元数据、所需环境变量等,使客户端(如 VS Code)能在首次使用时自动提示用户配置,实现无缝设置。

开发与部署 MCP 服务实战

项目初始化与开发

  1. 安装模板dotnet new install Microsoft.Extensions.AI.Templates

dotnet new install Microsoft.Extensions.AI.Templates`
这个命令会安装包含 mcpserver 模板的包:

Success: Microsoft.Extensions.AI.Templates::9.7.2-preview.3.25366.2 installed the following templates:
Template Name                 Short Name  Language  Tags
----------------------------  ----------  --------  --------------------------------
AI Chat Web App               aichatweb   [C#]      Common/AI/Web/Blazor/.NET Aspire
Local MCP Server Console App  mcpserver   [C#]      Common/AI/MCP
  1. 创建项目dotnet new mcpserver -n SampleMcpServer

  2. 理解结构:项目包含 Program.cs (入口点,配置 MCP 服务器、传输协议和工具)、示例工具类(如 RandomNumberTools.cs)和关键的 .mcp/server.json 配置文件。

生成的项目包含几个关键文件:

  • Program.cs:这是应用程序的入口点。您会看到一个流畅的配置链,用于设置 MCP 服务器:

    • AddMcpServer():注册 MCP 服务器所需的服务。

    • WithStdioServerTransport():配置服务器使用标准输入/输出(stdio)进行通信,这是本地工具的理想选择。

    • WithTools():添加工具 。

  • Tools/RandomNumberTools.cs:这是一个示例工具类,用于演示核心属性的用法:

    • McpServerToolType:标记一个类是 MCP 工具的容器。

    • McpServerTool:将一个公共静态方法暴露为 MCP 工具。

    • Description:为工具及其参数提供自然语言描述,这是引导 LLM 如何正确调用该工具的关键 。

  • .mcp/server.json :声明服务元数据、所需环境变量等

  1. 实现自定义工具:在 Tools 目录下创建工具类(WeatherTools.cs),使用 [McpServerToolType] 和 [McpServerTool] 属性标记,并提供清晰的 [Description] 指导 LLM。

using System.ComponentModel;
using ModelContextProtocol.Server;

namespaceSampleMcpServer.Tools;

[McpServerToolType]
publicclassWeatherTools
{
    [McpServerTool]
    [Description("Describes random weather in the provided city.")]
    public string GetCityWeather(
        [Description("Name of the city to return weather for")] string city)
    {
        // Read the environment variable during tool execution.
        // Alternatively, this could be read during startup and passed via IOptions dependency injection
        var weather = Environment.GetEnvironmentVariable("WEATHER_CHOICES");
        if (string.IsNullOrWhiteSpace(weather))
        {
            weather = "balmy,rainy,stormy";
        }

        var weatherChoices = weather.Split(",");
        var selectedWeatherIndex = Random.Shared.Next(0, weatherChoices.Length);

        return$"The weather in {city} is {weatherChoices[selectedWeatherIndex]}.";
    }
}

这个工具演示了:

  • 接受来自 LLM 的参数(string city)。

  • 在参数上使用 Description 属性来指导 LLM。

  • 访问环境变量等配置,以提供动态行为 。

  1. 注册工具: 最后,别忘了在 Program.cs 中注册这个新工具类:

// Add the MCP services: the transport to use (stdio) and the tools to register.
builder.Services
    .AddMcpServer()
    .WithStdioServerTransport()
    .WithTools<RandomNumberTools>()
    .WithTools<WeatherTools>();

await builder.Build().RunAsync();
  1. 本地测试 (VS Code)  : 在项目目录下创建.vscode/mcp.json,然后用vs code 打开,再打开github copilot输入问题即可测试:

  2. 生成一个随机数。

  3. 北京今天天气如何?

{
  "servers": {
    "SampleMcpServer": {
      "type": "stdio",
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "."
      ],
      "env": {
        "WEATHER_CHOICES": "sunny,humid,freezing,perfect"
      }
    }
  }
}

打包与发布

  1. 项目配置:确保 .csproj 文件包含:

    <PackAsTool>true</PackAsTool>
    <PackageType>McpServer</PackageType>
    <PackageId>sheng-jie.SampleMcpServer</PackageId>
    <PackageVersion>0.2.0</PackageVersion>
  2. 更新 server.json:确保 name 和 version 与包信息匹配,并补充描述、环境变量要求、仓库链接等。 然后修改.mcp/server.json 将上面的PackageId 和PackageVersion 更新到对应的nameversion 中,并补充其他说明:

{
  "description": "一个带有天气和随机数工具的示例MCP服务器",
"name": "io.github.sheng-jie/SampleMcpServer",
"packages": [
    {
      "registry_name": "nuget",
      "name": "sheng-jie.SampleMcpServer",
      "version": "0.2.0",
      "package_arguments": [],
      "environment_variables": [
        {
          "name": "WEATHER_CHOICES",
          "description": "以逗号分隔的天气描述列表",
          "is_required": true,
          "is_secret": false
        }
      ]
    }
  ],
"repository": {
    "url": "https://github.com/sheng-jie/SampleMcpServer",
    "source": "github"
  },
"version_detail": {
    "version": "0.2.0"
  }
}
  1. 打包:执行 dotnet pack -c Release

  2. 发布:将生成的 .nupkg 文件上传到 NuGet.org。

使用 dnx 运行与集成验证

  • 本地执行验证

    dnx sheng-jie.SampleMcpServer@0.2.0 --yes
  • 集成到 AI 平台 (如 Cherry Studio) :在平台中添加 stdio 传输协议的 MCP Server,指向 dnx 命令或包名。成功调用工具验证集成。

展望:.NET 在 AI 服务领域的新篇章

结合对 NuGet 上 MCP 服务的支持和 dnx 的敏捷执行能力,.NET 不仅能够消费 AI 库,更能以标准化、可发现且易于消费的方式分发和运行可执行的 AI 服务。这种能力是 .NET 深入参与现代 AI 应用开发的关键一步。

可以预见,NuGet 上将涌现一个蓬勃发展的 .NET AI 服务包新生态。这一系列创新,将进一步巩固 .NET 作为构建复杂、现代化、AI 集成应用程序的首选平台的地位。

现在正是 .NET 开发者拥抱 AI 的最佳时机!

示例项目: https://github.com/sheng-jie/SampleMcpServer

官方指南: https://devblogs.microsoft.com/dotnet/mcp-server-dotnet-nuget-quickstart/

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐