关于 .NET MCP Server
一个 MCP 服务,让 Claude、GitHub Copilot 等 AI 助手直接调用 .NET SDK,完成创建项目、管理 NuGet 包、构建和测试等操作。服务在本机运行,面向 .NET 开发者。
主要功能
- 01通过结构化工具调用 dotnet 命令
- 02读取已安装的模板及其参数
- 03查询 NuGet 包信息与版本
- 04提供 SDK、运行时、框架等只读资源
- 05对常见 CS、MSB、NU、NETSDK 错误提供诊断说明
- 06敏感信息在命令输出中自动脱敏
适用场景
- 01用自然语言创建 Web API 或控制台项目
- 02添加或更新 NuGet 包并完成还原
- 03运行测试并分析构建失败原因
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露 dotnet_project、dotnet_sdk 等工具,以及 dotnet:// 资源和若干提示词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
.NET MCP 服务
为你的 AI 助手赋予 .NET 开发超能力!此 MCP 服务可将 GitHub Copilot、Claude 和其他 AI 助手直接连接到 .NET SDK,让它们能够通过自然语言创建项目、管理包、运行生成等。
快速安装
注意:快速安装需要 .NET 10 SDK。
这是什么?
.NET MCP 服务是一个模型上下文协议(MCP)服务,它使用模型上下文协议将 AI 助手连接到 .NET SDK。你可以把它想象成让 AI 助手直接调用 dotnet 命令,同时还能理解智能和上下文。
重要:此包专为用作 AI 助手的 MCP 服务而设计,不适用于作为库或在其他 .NET 应用程序中以编程方式调用。唯一受支持的用法是通过
dnx或dotnet run将其作为 MCP 服务运行。
graph LR
A[AI Assistant<br/>Copilot/Claude] -->|Natural Language| B[.NET MCP Server]
B -->|dotnet commands| C[.NET SDK]
C -->|Results| B
B -->|Structured Response| A
style A fill:#e1f5ff
style B fill:#fff4e6
style C fill:#e8f5e9
为什么使用它?
🚀 更快的开发
不用再记忆准确的 dotnet 命令和语法,只需提出需求:
- “创建一个使用 Entity Framework 的新 Web API 项目”
- “添加 Serilog 包并配置结构化日志记录”
- “将我的所有 NuGet 包更新到最新版本”
🧠 更智能的 AI 辅助
你的 AI 助手可以直接访问:
- 所有已安装的 .NET 模板及其参数
- NuGet 包搜索和元数据
- 框架版本信息(包括 LTS 状态)
- 你的解决方案和项目结构
⚡ 从设计上实现高效使用 Token
服务器不依赖大模型通过反复读取控制台输出来推断状态,而是提供专为此设计的 .NET 工具,并采用结构化输入和输出。在实际使用中,这通常意味着每项任务消耗的 Token 更少,来回沟通也更少。
- 确定性的工具架构可减少提示词/响应开销
machineReadable: true会返回结构化 JSON(无需抓取日志)- MCP 资源提供轻量级元数据,无需运行命令
🎯 为什么不直接让 AI 调用 dotnet?
.NET MCP Server 提供了原始 CLI 执行无法提供的上下文和智能:
1. 模板发现与验证
- 使用 MCP:AI 能准确了解已安装的模板(
console、webapi、blazor等)及其参数 - 不使用 MCP:AI 会猜测模板名称和参数,且往往会出错
2. 框架智能
- 使用 MCP:AI 能了解已安装的 .NET 版本、哪些版本是 LTS,并据此给出建议
- 不使用 MCP:如果你只安装了
net10.0,AI 却建议使用net8.0,从而导致错误
3. 丰富的工具描述
- 使用 MCP:每个工具都有详细的参数说明和约束(例如,“配置必须为 Debug 或 Release”)
- 不使用 MCP:AI 根据常识构造命令,可能会遗漏特定版本的变更
4. 参数信息
- 使用 MCP:AI 能看到
--use-controllers、--auth等模板参数及框架选项 - 不使用 MCP:AI 不知道每个模板有哪些可选参数
5. 包搜索集成
- 使用 MCP:AI 可以搜索 NuGet.org,查找准确的包名称和版本
- 不使用 MCP:AI 会猜测包名称,往往会推荐过时或错误的包
6. 通过增强诊断实现结构化错误处理
- 使用 MCP:系统会解析错误,并补充说明、文档链接和建议的修复方法
- 不使用 MCP:AI 只能获取原始 stderr 输出,可能会误解错误
服务器针对 52 种常见错误代码提供增强错误诊断:
- 用通俗易懂的语言解释出错原因
- 提供指向 Microsoft 官方文档的直接链接
- 提供具体的修复建议和用于解决问题的命令
- 支持 CS####、MSB####、NU#### 和 NETSDK#### 错误代码
详情请参阅错误诊断文档。
7. MCP 资源
MCP 资源提供对 .NET 环境结构化元数据的只读访问:
- dotnet://sdk-info - 已安装 .NET SDK 的信息(版本和路径)
- dotnet://runtime-info - 已安装 .NET 运行时的信息(版本和类型)
- dotnet://templates - 已安装 .NET 模板的完整目录及其元数据
- dotnet://frameworks - 支持的 .NET 框架(TFM)信息,包括 LTS 状态
- dotnet://workspace - 工作区快照,包含解决方案、项目、目标框架和包数量
这使 AI 助手能够:
- 无需执行命令即可回答问题(“我安装了哪些 .NET 版本?”)
- 根据你的实际环境提供有上下文的建议
- 比解析 CLI 输出更高效地访问结构化 JSON 数据
- 参考官方 .NET 元数据,提供准确的建议
示例:使用资源提供有上下文的协助
❌ Without Resources:
User: "What .NET versions do I have?"
AI: Executes dotnet --list-sdks and parses output
User: "Which is LTS?"
AI: Executes dotnet --info and tries to parse support info
✅ With Resources:
User: "What .NET versions do I have?"
AI: Reads dotnet://sdk-info resource (no execution needed)
Returns: .NET 8.0 (LTS), .NET 9.0 (STS), .NET 10.0 (LTS)
User: "Which is LTS?"
AI: Already knows from resource metadata - .NET 8.0, .NET 10.0
示例:创建带身份验证的 Blazor 项目
❌ Without MCP:
AI: "I'll run: dotnet new blazor --auth Individual"
Result: Error - template 'blazor' doesn't support --auth parameter
✅ With MCP:
AI: Uses dotnet_sdk with action: "TemplateInfo" for 'blazor'
Sees available parameters: --interactivity, --use-program-main, --empty
Uses dotnet_sdk with action: "SearchTemplates" to find authentication templates
AI: "I'll create a Blazor Web App with authentication using the correct template..."
Result: Success - uses 'blazor' template with proper authentication configuration
✨ 结果一致
MCP 服务使用官方 .NET SDK API 和 CLI 命令,确保:
- 从 Template Engine 获取准确的模板信息
- 可靠地执行命令
- 妥善处理错误并进行验证
🔒 安全设计
- 在你的计算机上本地运行
- 不会向外部服务器发送数据
- 由你控制执行哪些命令
- 适用标准 .NET 安全模型
- 自动脱敏机密信息,保护 CLI 输出中的敏感信息
- 自动脱敏连接字符串、密码和 API 密钥
- 使用经过优化的正则表达式实现,性能开销低于 1%
- 引用 Microsoft.Extensions.Compliance.Redaction,以便未来集成
- 可通过
unsafeOutput=true选择退出,便于高级调试 - 覆盖的模式包括:数据库凭据、云服务提供商密钥、令牌、证书等
- 性能影响极小,且已测试在 500ms 内处理完 10,000 行
- 可选的 MCP 治理控制(预览版)
- 通过配置启用时使用
Microsoft.AgentGovernance.Extensions.ModelContextProtocol - 默认禁用,以保留现有行为和兼容性
- 不附带默认强制执行的策略;如有需要,请提供自己的策略文件
- 请参阅
doc/mcp-governance.md中的示例mcp.yaml策略模板 - 来源:
- Agent Governance Toolkit 存储库:https://github.com/microsoft/agent-governance-toolkit
- 适用于 .NET 的 Agent Governance Toolkit:https://github.com/microsoft/agent-governance-toolkit/tree/main/agent-governance-dotnet
- 公告:https://devblogs.microsoft.com/dotnet/announcing-agent-governance-toolkit-mcp-extensions-for-dotnet/
- 可通过以下方式启用启动扫描、基于策略的工具授权和响应清理:
- 通过配置启用时使用
"McpGovernance": {
"Enabled": true,
"DefaultAgentId": "did:mcp:anonymous",
"ServerName": "dotnet-mcp",
"PolicyPaths": ["/path/to/your/policies/mcp.yaml"]
}
工作原理
sequenceDiagram
participant User
participant AI as AI Assistant
participant MCP as .NET MCP Server
participant SDK as .NET SDK
User->>AI: "Create a console app called MyApp"
AI->>MCP: dotnet_project(action: "New", template: "console", name: "MyApp")
MCP->>SDK: dotnet new console -n MyApp
SDK-->>MCP: Project created successfully
MCP-->>AI: Structured result with output
AI-->>User: "I've created a new console app called MyApp"
.NET MCP 服务充当智能中间件,用于:
- 转换自然语言请求,将其转化为结构化的 .NET SDK 操作
- 验证参数,使用官方 SDK 元数据(模板、框架、包)
- 执行命令,并妥善处理错误
- 返回结构化结果,供 AI 助手理解和解释
🧩 使用的 MCP C# SDK 功能
dotnet-mcp 使用官方的 MCP C# SDK,并应用了许多 MCP 功能,不局限于基本的工具调用:
| 功能 | dotnet-mcp 的用法 | 用途 |
|---|---|---|
| 资源 | 将 dotnet://sdk-info、dotnet://runtime-info、dotnet://templates、dotnet://frameworks 和 dotnet://workspace 公开为只读 MCP 资源。 | 让客户端无需调用 shell 即可快速回答有关环境和工作区拓扑的问题,并减少反复通过 CLI 发现信息造成的令牌消耗。 |
| 提示词 | 发布可复用的提示词,例如 create_new_webapi、add_package_and_restore 和 run_tests_with_coverage。 | 为 MCP 客户端提供引导式、可发现的工作流,无需从头重建常用的提示词框架。 |
| 根目录 | 使用客户端工作区根目录,在用户未提供明确路径时自动检测单个项目或解决方案。 | 改善 IDE 客户端的开箱即用体验,并减少用户需要提供的参数数量。 |
| 采样 | 在客户端支持采样时,请求由客户端处理的大模型摘要,分析构建和测试失败。 | 无需单独的服务端模型凭据,即可在 MCP 流程中完成智能诊断。 |
| 征询 | 在执行 clean 和移除解决方案等破坏性操作前,请求明确确认。 | 为删除构件或更改项目结构的操作增加人在环路中的安全检查。 |
| 进度通知 | 报告耗时较长的还原、构建、测试、发布、打包、工具和工作负载操作的开始与完成进度。 | 为客户端提供更好的慢速操作用户体验,并简化能够显示进度的 Agent 的编排。 |
| 任务 | 注册 IMcpTaskStore,并为 dotnet_project 声明可选的任务支持,以处理耗时较长的操作。 | 支持异步执行、轮询和取消模式,而不必让每个耗时较长的请求都阻塞会话。 |
| 工具和工具元数据 | 使用整合后的工具,并提供丰富的元数据,例如标题、类别、优先级、操作列表和任务支持声明。 | 提高可发现性、路由效率和客户端展示效果,尤其是在支持 MCP 的 IDE 集成中。 |
| 提示词和资源补全 | 实现补全处理程序,让客户端可以自动补全提示词和资源的参数值。 | 加快引导式工作流,并减少支持补全体验的客户端中的无效参数输入。 |
| 图标和服务元数据 | 配置服务级图标,以及整合后的接口中每个工具的 IconSource、标题和描述性元数据。 | 帮助客户端更清晰地展示服务和工具目录,尤其是在可视化 MCP 管理界面中。 |
安装
要求
- 快速安装:.NET 10 SDK
- 手动安装:.NET 10 SDK
- Visual Studio Code、Visual Studio 2022(v17.13+)或 Claude Desktop
选项 1:快速安装(推荐)
使用本页面顶部的安装徽章,在你的环境中自动配置 MCP 服务。首次使用时,服务将从 NuGet.org 下载。
选项 2:手动配置
请按照以下说明为你的开发环境进行配置:
Visual Studio Code
使用快速安装(推荐——需要 .NET 10):
- 点击本页顶部的 VS Code 安装徽章
- 或通过命令面板手动添加:按
Ctrl+Shift+P(macOS 上按Cmd+Shift+P),运行 "GitHub Copilot: Add MCP Server",然后输入 名称dotnet、类型stdio、命令dnx和 参数Community.Mcp.DotNet@1.* --yes。
手动配置(适用于从源码构建或自定义设置):
编辑 VS Code 设置(按 Ctrl+, 或 Cmd+,,搜索 "mcp"):
{
"github.copilot.chat.mcp.servers": {
"dotnet": {
"type": "stdio",
"command": "dotnet",
"args": ["run", "--project", "/path/to/dotnet-mcp/DotNetMcp/DotNetMcp.csproj"]
}
}
}
Visual Studio 2022
要求:Visual Studio 2022 17.13 版或更高版本
使用快速安装(推荐——需要 .NET 10):
- 点击本页顶部的 Visual Studio 安装徽章
- 或通过选项手动添加:转到 工具 > 选项 > GitHub Copilot > MCP 服务,点击 添加,然后输入 名称
dotnet、类型stdio、命令dnx和 参数Community.Mcp.DotNet@1.* --yes。
手动配置(适用于从源码构建或自定义设置):
- 转到 工具 > 选项 > GitHub Copilot > MCP 服务
- 点击 添加
- 输入:
- 名称:
dotnet - 类型:
stdio - 命令:
dotnet - 参数:
run --project C:\path\to\dotnet-mcp\DotNetMcp\DotNetMcp.csproj
- 名称:
Claude Desktop
使用 DNX(推荐——需要 .NET 10):
macOS:编辑 ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"dotnet": {
"command": "dnx",
"args": ["Community.Mcp.DotNet@1.*", "--yes"]
}
}
}
Windows:编辑 %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"dotnet": {
"command": "dnx",
"args": ["Community.Mcp.DotNet@1.*", "--yes"]
}
}
}
手动配置(适用于从源码构建或自定义设置):
macOS:
{
"mcpServers": {
"dotnet": {
"command": "dotnet",
"args": ["run", "--project", "/path/to/dotnet-mcp/DotNetMcp/DotNetMcp.csproj"]
}
}
}
Windows:
{
"mcpServers": {
"dotnet": {
"command": "dotnet",
"args": ["run", "--project", "C:\\path\\to\\dotnet-mcp\\DotNetMcp\\DotNetMcp.csproj"]
}
}
}
GitHub Copilot 编码 Agent(仓库 MCP 配置)
你也可以在仓库级别为 GitHub Copilot 编码 Agent 配置此 MCP 服务。
- 在 GitHub 上打开你的仓库
- 转到 Settings > Copilot > Coding agent
- 将以下 JSON 粘贴到 MCP 配置框中
- 点击 Save
详情请参阅 GitHub 文档:使用模型上下文协议 (MCP) 扩展 GitHub Copilot 编码 Agent
{
"mcpServers": {
"dotnet": {
"type": "local",
"command": "dnx",
"args": ["Community.Mcp.DotNet@1.*", "--yes"],
"tools": [
"dotnet_project",
"dotnet_package",
"dotnet_solution",
"dotnet_sdk",
"dotnet_help",
"dotnet_server_capabilities",
"dotnet_server_info"
]
}
}
}
此配置使用经过筛选的工具允许列表(而不是 "*"),让 Agent 能够安全且可预测地使用 .NET MCP 服务。
注意:Copilot 编码 Agent 在 GitHub Actions 运行器上运行。如果需要确保仓库中已安装 .NET 10,请添加一个设置工作流,例如 .github/workflows/copilot-setup-steps.yml。
使用示例
配置完成后,你可以使用自然语言与 AI 助手交互:
快速入门——单个项目
用户:“创建一个名为 WeatherService 的新 Web API 项目”
AI:我来为你创建一个新的 Web API 项目……
dotnet new webapi -n WeatherService
项目已在 WeatherService 目录中成功创建。
复杂应用——使用 Aspire 的微服务
用户:“创建一个服务端 Web 应用和最小 API,使用 .NET Aspire 进行编排,并使用 xunit 为 API 编写单元测试。解决方案使用 slnx 格式。”
AI:我来为你创建一个由 .NET Aspire 编排的完整微服务解决方案……
# Create solution with new XML format
dotnet new sln -n MyMicroservices --use-slnx
# Create .NET Aspire AppHost for orchestration
dotnet new aspire-apphost -n MyMicroservices.AppHost
# Create web app
dotnet new webapp -n MyMicroservices.Web
# Create minimal API
dotnet new webapi -n MyMicroservices.Api --use-minimal-apis
# Create test project
dotnet new xunit -n MyMicroservices.Api.Tests
# Add projects to solution
dotnet sln add MyMicroservices.AppHost/MyMicroservices.AppHost.csproj
dotnet sln add MyMicroservices.Web/MyMicroservices.Web.csproj
dotnet sln add MyMicroservices.Api/MyMicroservices.Api.csproj
dotnet sln add MyMicroservices.Api.Tests/MyMicroservices.Api.Tests.csproj
# Add project references for tests
dotnet add MyMicroservices.Api.Tests/MyMicroservices.Api.Tests.csproj reference MyMicroservices.Api/MyMicroservices.Api.csproj
已创建包含 4 个项目的解决方案:用于编排的 AppHost、Web 应用、API 和单元测试。可通过 dotnet run --project MyMicroservices.AppHost 运行。
使用 Entity Framework 构建数据库驱动的应用程序
用户:“为我的 API 配置 Entity Framework Core 和 SQL Server,并创建初始数据库迁移”
AI:我会添加 EF Core 包、安装 dotnet-ef 工具,并创建初始迁移……
# Add Entity Framework packages
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design
# Install dotnet-ef tool globally
dotnet tool install dotnet-ef --global
# Create initial migration
dotnet ef migrations add InitialCreate
# Apply migration to create database
dotnet ef database update
已添加 Entity Framework Core 的 SQL Server 提供程序。已创建并应用初始迁移。数据库已准备就绪。
用户:“我在 DbContext 中添加了一个 Product 实体。更新数据库架构”
AI:我会为你的 Product 实体创建迁移并应用它……
# Create migration for new entity
dotnet ef migrations add AddProductEntity
# List migrations to see what's pending
dotnet ef migrations list
# Apply the migration
dotnet ef database update
已为 Product 实体创建迁移(新增表,包含 Id、Name、Price、CreatedDate 列)。数据库已成功更新。
用户:“为上一次迁移生成 SQL 脚本,以便我在生产环境部署前审查”
AI:我会根据你的迁移生成幂等 SQL 脚本……
# Generate idempotent SQL script (can be run multiple times safely)
dotnet ef migrations script --idempotent --output deploy.sql
SQL 脚本已生成至 deploy.sql。此脚本可以安全地多次运行,并且只会在需要时应用更改。
数据库优先开发
用户:“我有一个现有的 SQL Server 数据库。将它反向工程为 Entity Framework 类”
AI:我会将你的数据库架构生成 Entity Framework Core 实体……
# Reverse engineer (scaffold) database to EF Core entities
dotnet ef dbcontext scaffold "Server=localhost;Database=MyExistingDb;Trusted_Connection=true;" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models
# List the generated DbContext classes
dotnet ef dbcontext list
# Get detailed info about the DbContext
dotnet ef dbcontext info
数据库架构生成成功。已在 Models 文件夹中生成 MyExistingDbContext.cs 和 15 个实体类(Customer、Order、Product 等)。
多目标测试策略
用户:“使用 NUnit 添加集成测试,目标框架同时设为 .NET 8 和 .NET 10,并配置代码覆盖率”
AI:我会设置多目标集成测试并启用覆盖率……
# Create NUnit test project
dotnet new nunit -n MyMicroservices.IntegrationTests
# Update project to multi-target (edit .csproj)
# <TargetFrameworks>net8.0;net10.0</TargetFrameworks>
# Add integration test packages
dotnet add MyMicroservices.IntegrationTests package Microsoft.AspNetCore.Mvc.Testing
dotnet add MyMicroservices.IntegrationTests package Microsoft.Testing.Extensions.CodeCoverage
# Run tests with coverage for both frameworks
dotnet test -- --coverage --coverage-output-format cobertura
已创建多目标集成测试项目。测试将在 .NET 8 和 .NET 10 上运行,并启用代码覆盖率。
探索与发现
用户:“有哪些可用于创建云原生应用程序的模板?”
AI:让我搜索与云原生相关的模板……
dotnet new search aspire
dotnet new search dapr
dotnet new search azure
找到以下模板:
aspire- .NET Aspire 应用程序aspire-apphost- .NET Aspire 应用宿主aspire-servicedefaults- .NET Aspire 服务默认配置dapr- Dapr 应用程序模板- 各种 Azure Functions 和 Container Apps 模板
每个模板都旨在用于云原生微服务和分布式应用程序。
现代化工作流
用户:“将所有包更新到最新版本,按照 editorconfig 规则格式化所有代码,然后构建并运行测试”
AI:我会更新包、格式化代码、构建并运行测试……
# Update all packages to latest compatible versions
dotnet package update
# Format all code according to .editorconfig
dotnet format
# Clean and rebuild
dotnet clean
dotnet build -c Release
# Run all tests
dotnet test --verbosity detailed
所有包均已更新到最新版本。整个解决方案的代码格式已统一。构建成功,警告数为 0。全部 156 项测试均已通过。
HTTPS 开发环境配置
用户:“运行 Web 应用时遇到 HTTPS 证书错误”
AI:让我检查你的 HTTPS 开发证书……
# Check certificate status
dotnet dev-certs https --check --trust
你的证书尚未受信任。我来修复……
# Trust the certificate (may require elevation)
dotnet dev-certs https --trust
证书现已受信任。请再次尝试运行应用。如果你使用 Docker,可以导出证书:
# Export for Docker containers
dotnet dev-certs https --export-path ./certs/aspnetapp.pfx --password "SecurePassword123!"
证书已导出到 ./certs/aspnetapp.pfx。现在可以将它挂载到 Docker 容器中。
使用 User Secrets 安全配置
用户:“为我的 API 项目配置 user secrets,并添加数据库连接字符串”
AI:我会为你的项目初始化 user secrets……
# Initialize user secrets (adds UserSecretsId to project file)
dotnet user-secrets init --project MyApi/MyApi.csproj
现在我会安全地添加数据库连接字符串……
# Store connection string (not committed to Git)
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=localhost;Database=MyDb;User=dev;Password=secret123"
机密已存储!你也可以添加 API 密钥:
# Add Azure OpenAI API key
dotnet user-secrets set "Azure:OpenAI:ApiKey" "sk-..."
# Add SendGrid API key
dotnet user-secrets set "SendGrid:ApiKey" "SG...."
让我查看当前配置:
# List all secrets
dotnet user-secrets list
输出:
ConnectionStrings:DefaultConnection = Server=localhost;Database=MyDb;User=dev;Password=secret123
Azure:OpenAI:ApiKey = sk-...
SendGrid:ApiKey = SG....
这些机密存储在你的用户配置文件中(而非项目中),不会提交到 Git。你可以在代码中这样访问:
var connectionString = builder.Configuration["ConnectionStrings:DefaultConnection"];
var apiKey = builder.Configuration["Azure:OpenAI:ApiKey"];
注意:User secrets 仅用于开发环境。生产环境请使用 Azure Key Vault 或环境变量。
移动端和 MAUI 开发设置
用户:“我想为 Android 和 iOS 开发一个 .NET MAUI 应用”
AI:我来帮你设置 MAUI 开发所需的工作负载……
# First, let's see what MAUI workloads are available
dotnet workload search maui
找到的工作负载:
Workload ID Description
-------------------------------------------
maui-android .NET MAUI SDK for Android
maui-ios .NET MAUI SDK for iOS
maui-windows .NET MAUI SDK for Windows
maui-tizen .NET MAUI SDK for Tizen
现在安装所需的工作负载:
# Install MAUI workloads for Android and iOS
# Warning: This will download several GB of SDKs and tools
dotnet workload install maui-android maui-ios
注意:上面的命令展示的是原始的
dotnetCLI 语法,其中工作负载 ID 以空格分隔。调用 .NET MCP 工作负载安装工具时,请将工作负载 ID 作为单个逗号分隔的参数传入,例如:workloadIds: "maui-android,maui-ios"。MCP 服务会将其转换为等效的 CLI 命令。
工作负载已安装!现在来验证一下:
# List installed workloads
dotnet workload list
输出:
Installed Workload Id Manifest Version Installation Source
----------------------------------------------------------------------
maui-android 10.0.100/10.0.100 SDK 10.0.100
maui-ios 10.0.100/10.0.100 SDK 10.0.100
现在可以创建 MAUI 项目了:
# Create a new MAUI app
dotnet new maui -n MyMauiApp
MAUI 开发环境已准备就绪!有 SDK 更新时,请更新工作负载:
# Update all installed workloads
dotnet workload update
可用工具
所有工具都包含视觉图标,便于在 AI 助手界面中发现。图标使用 Microsoft Fluent UI Emoji,提供一致的视觉呈现(📁 项目、📦 包、⚙️ SDK、🛠️ 工具等)。
该服务通过整合型 MCP 工具提供全面的 .NET 开发功能。这些工具按领域对相关操作进行分组,便于 AI 助手选择合适的工具并编排工作流。
注意:.NET MCP Server 仅使用整合型工具。每个整合型工具都通过
action参数提供多个相关操作。与每项操作都使用单独工具相比,这种设计能改善 AI 编排,并提供更清晰的语义组织。
MCP 资源(只读上下文)
该服务公开只读资源,以便高效访问 .NET 环境元数据:
- dotnet://sdk-info - 已安装 .NET SDK 的信息(版本和路径)
- dotnet://runtime-info - 已安装 .NET 运行时的信息(版本和类型)
- dotnet://templates - 已安装 .NET 模板的完整目录及其元数据
- dotnet://frameworks - 支持的 .NET 框架(TFM)信息,包括 LTS 状态
- dotnet://workspace - 工作区快照,包含解决方案、项目、目标框架和包数量
资源提供结构化 JSON 数据。对于频繁访问的只读信息,使用资源比调用工具更高效。
整合型工具
这些工具使用操作枚举对相关操作进行分组,从而改善 AI 编排并提供更清晰的语义组织。
dotnet_project - 项目生命周期管理
所有项目操作的统一接口:新建、还原、构建、运行、测试、发布、清理、分析、依赖项、验证、打包、监视、格式化、停止、日志
此版本新增:
- Logs 操作:从后台进程会话获取 stdout/stderr 日志
- Run 的后台模式:使用
startMode: "Background"在后台启动进程,并通过会话 ID 获取日志 - Stop 操作:通过会话 ID 终止长时间运行的进程会话(例如
dotnet run) - noBuild 参数:运行前跳过构建(对应
dotnet run --no-build)
测试运行器兼容性:Test 操作会根据 global.json 配置自动检测测试运行器。如果 global.json 中包含 { "test": { "runner": "Microsoft.Testing.Platform" } },则使用 --project 标志(MTP 模式)。否则,为兼容旧版本,默认使用位置参数(VSTest 模式)。
你可以使用 testRunner 参数显式指定测试运行器:
Auto(默认)- 从 global.json 自动检测MicrosoftTestingPlatform- 使用 --project 标志(需要支持 MTP 的 .NET SDK 8+ 或 SDK 10+)VSTest- 使用位置参数(兼容所有 SDK 版本)
useLegacyProjectArgument 参数已弃用;请改用 testRunner: "VSTest"。
示例:
// Create a new web API project
await callTool("dotnet_project", {
action: "New",
template: "webapi",
name: "MyApi"
});
// Build the project
await callTool("dotnet_project", {
action: "Build",
project: "MyApi/MyApi.csproj",
configuration: "Release"
});
// Run in background mode to get session ID
const runResult = await callTool("dotnet_project", {
action: "Run",
project: "MyApi/MyApi.csproj",
noBuild: true,
startMode: "Background",
machineReadable: true
});
const sessionId = runResult.metadata.sessionId;
// Wait a moment for the application to start...
// Retrieve logs from the background session
await callTool("dotnet_project", {
action: "Logs",
sessionId: sessionId,
machineReadable: true
});
// Retrieve only the last 50 lines of logs
await callTool("dotnet_project", {
action: "Logs",
sessionId: sessionId,
tailLines: 50,
machineReadable: true
});
// Retrieve logs since a specific timestamp
await callTool("dotnet_project", {
action: "Logs",
sessionId: sessionId,
since: "2024-01-01T12:00:00Z",
machineReadable: true
});
// Stop the background process
await callTool("dotnet_project", {
action: "Stop",
sessionId: sessionId
});
// Run tests (auto-detects test runner from global.json)
await callTool("dotnet_project", {
action: "Test",
project: "MyApi.Tests/MyApi.Tests.csproj"
});
// Run tests with explicit test runner (MTP)
await callTool("dotnet_project", {
action: "Test",
project: "MyApi.Tests/MyApi.Tests.csproj",
testRunner: "MicrosoftTestingPlatform"
});
// Run tests with explicit test runner (VSTest)
await callTool("dotnet_project", {
action: "Test",
project: "MyApi.Tests/MyApi.Tests.csproj",
testRunner: "VSTest"
});
dotnet_package - 包与引用管理
管理 NuGet 包和项目引用:Add、Remove、Search、Update、List、AddReference、RemoveReference、ListReferences、ClearCache
示例:
// Search for a package
await callTool("dotnet_package", {
action: "Search",
searchTerm: "serilog"
});
// Add package to project
await callTool("dotnet_package", {
action: "Add",
packageId: "Serilog.AspNetCore",
project: "MyApi/MyApi.csproj"
});
dotnet_solution - 解决方案文件管理
与 dotnet sln / dotnet solution CLI 命令完全对等。
管理解决方案文件和项目成员关系:Create、Add、List、Remove
示例:
// Create a solution (classic .sln format)
await callTool("dotnet_solution", {
action: "Create",
name: "MyApp"
});
// Create a solution (new .slnx XML format)
await callTool("dotnet_solution", {
action: "Create",
name: "MyApp",
format: "slnx"
});
// Add projects to solution
await callTool("dotnet_solution", {
action: "Add",
solution: "MyApp.slnx",
projects: ["MyApi/MyApi.csproj", "MyWeb/MyWeb.csproj"]
});
// List projects in solution
await callTool("dotnet_solution", {
action: "List",
solution: "MyApp.slnx"
});
// Remove projects from solution
await callTool("dotnet_solution", {
action: "Remove",
solution: "MyApp.slnx",
projects: ["MyWeb/MyWeb.csproj"]
});
dotnet_ef - Entity Framework Core 操作
数据库迁移、DbContext 管理和脚手架生成:MigrationsAdd、MigrationsList、MigrationsRemove、MigrationsScript、DatabaseUpdate、DatabaseDrop、DbContextList、DbContextInfo、DbContextScaffold
示例:
// Create a migration
await callTool("dotnet_ef", {
action: "MigrationsAdd",
name: "InitialCreate",
project: "MyApi/MyApi.csproj"
});
// Update database
await callTool("dotnet_ef", {
action: "DatabaseUpdate",
project: "MyApi/MyApi.csproj"
});
dotnet_workload - 工作负载管理
安装和管理 .NET 工作负载(MAUI、WASM 等):List、Info、Search、Install、Update、Uninstall
示例:
// Search for workloads
await callTool("dotnet_workload", {
action: "Search",
searchTerm: "maui"
});
// Install workloads
await callTool("dotnet_workload", {
action: "Install",
workloadIds: "maui-android,maui-ios"
});
dotnet_tool - .NET 工具管理
管理全局和本地 .NET 工具:Install、List、Update、Uninstall、Restore、CreateManifest、Search、Run
示例:
// Install a tool globally
await callTool("dotnet_tool", {
action: "Install",
packageId: "dotnet-ef",
global: true
});
// Search for tools
await callTool("dotnet_tool", {
action: "Search",
searchTerm: "format"
});
dotnet_sdk - SDK 和模板信息
查询 SDK、运行时、模板和框架信息:Version、Info、ListSdks、ListRuntimes、ListTemplates、SearchTemplates、TemplateInfo、ListTemplatePacks、InstallTemplatePack、UninstallTemplatePack、ClearTemplateCache、FrameworkInfo、CacheMetrics
示例:
// Get SDK version
await callTool("dotnet_sdk", {
action: "Version"
});
// List available templates
await callTool("dotnet_sdk", {
action: "ListTemplates"
});
// Search for templates
await callTool("dotnet_sdk", {
action: "SearchTemplates",
searchTerm: "web"
});
// List installed template packs
await callTool("dotnet_sdk", {
action: "ListTemplatePacks"
});
// Install a template pack (NuGet package ID + version)
await callTool("dotnet_sdk", {
action: "InstallTemplatePack",
templatePackage: "Aspire.ProjectTemplates",
templateVersion: "13.1.0"
});
// Uninstall a template pack
await callTool("dotnet_sdk", {
action: "UninstallTemplatePack",
templatePackage: "Aspire.ProjectTemplates"
});
dotnet_dev_certs - 开发人员证书和机密
管理 HTTPS 证书和用户机密:CertificateTrust、CertificateCheck、CertificateClean、CertificateExport、SecretsInit、SecretsSet、SecretsList、SecretsRemove、SecretsClear
示例:
// Trust development certificate
await callTool("dotnet_dev_certs", {
action: "CertificateTrust"
});
// Set a user secret
await callTool("dotnet_dev_certs", {
action: "SecretsSet",
key: "ConnectionStrings:DefaultConnection",
value: "Server=localhost;Database=MyDb",
project: "MyApi/MyApi.csproj"
});
实用工具
- dotnet_help - 获取任何 dotnet 命令的帮助
- dotnet_server_capabilities - 获取 MCP 服务能力和并发使用指导
从源代码构建
用于开发或贡献:
git clone https://github.com/jongalloway/dotnet-mcp.git
cd dotnet-mcp
dotnet build --project DotNetMcp/DotNetMcp.csproj
运行服务:
dotnet run --project DotNetMcp/DotNetMcp.csproj
服务通过 stdio 传输进行通信,设计为由 MCP 客户端调用。
项目结构
本项目已发展到逐文件列出完整结构不再实用的程度。 因此,本节将重点介绍关键入口点和仓库的主要部分。
dotnet-mcp/
├── DotNetMcp/ # Main MCP server project (packed as a .NET tool)
│ ├── Program.cs # Hosting + MCP server wiring
│ ├── DotNetMcp.csproj # NuGet/package metadata (PackAsTool, server.json packing)
│ ├── .mcp/server.json # MCP server metadata (packed into the NuGet package)
│ ├── Resources/ # MCP resources (SDK/runtime/templates/frameworks)
│ ├── DotNetCliTools.cs # Tool surface area (split into partials in Tools/)
│ └── Tools/ # Tool implementations grouped by domain (project, package, EF, etc.)
├── DotNetMcp.Tests/ # Unit + integration tests
├── doc/ # Long-form documentation (architecture, concurrency, testing, etc.)
├── scripts/ # Maintenance & validation scripts
├── artifacts*/ # Build outputs (CI + local)
├── .github/ # CI workflows and repo automation
├── DotNetMcp.slnx # Solution file (.slnx)
├── global.json # SDK pinning for consistent builds
├── .config/dotnet-tools.json # Local tool manifest (dotnet local tools)
└── LICENSE # MIT License
可供入手的关键文件:
DotNetMcp/Program.cs- 服务启动和注册DotNetMcp/DotNetCliTools.cs和DotNetMcp/Tools/- MCP 工具实现DotNetMcp/Resources/DotNetResources.cs- 只读 MCP 资源DotNetMcp/.mcp/server.json- 打包的 MCP 服务元数据DotNetMcp.Tests/- 测试(包括 server.json 验证和 XML 文档覆盖率)
技术栈
- 协议:Model Context Protocol (MCP)
- SDK:MCP SDK for .NET v1.0.0
- 运行时:.NET 10.0(目标框架)
- 传输:stdio(标准输入/输出)
- NuGet 包:
Microsoft.TemplateEngine.Abstractions和Edge(v10.0.101)- 模板元数据Microsoft.Build.Utilities.Core和Microsoft.Build(v18.0.2)- 项目验证
文档
- 📖 变更日志 - 版本历史和发行说明
- 📖 AI 助手最佳实践指南 - 工作流、提示词、集成模式和故障排查
- 📖 机器可读 JSON 契约 - 用于以编程方式使用工具的 v1.0 稳定契约
- 📖 工具接口整合 - 整合后的工具设计和架构
- 📖 遥测与可观测性 - 请求耗时日志记录、OpenTelemetry 集成和性能监控
- 📖 SDK 集成详情 - 技术架构和 SDK 用法
- 📖 高级主题 - 性能、日志记录和安全详情
- 📖 发布 - 如何进行发布(检查清单 + 脚本)
- 📖 并发安全 - 面向 AI 编排器的并行执行指南
- 📖 测试 - 如何运行测试(包括选择加入的交互式测试)
- 📖 Model Context Protocol - MCP 官方规范
- 📖 MCP C# SDK 文档 - SDK 文档
互操作性
.NET MCP Server 遵循 Model Context Protocol 规范,并提供丰富的元数据,以支持工具发现和 AI 编排:
服务元数据
该服务包含一个 MCP Registry server.json 配置文件(.mcp/server.json),其中提供:
-
环境变量:针对 MCP 用法优化的 .NET CLI 设置
DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1- 跳过首次设置DOTNET_NOLOGO=1- 隐藏启动消息
-
包信息:NuGet 包详情,便于通过
dnx安装(需要 .NET 10)- 包:
Community.Mcp.DotNet - 注册表:NuGet.org
- 传输方式:stdio
- 包:
-
仓库信息:指向源代码仓库的链接
工具和资源元数据通过 MCP 协议(工具/资源列表)在运行时发现,来源于服务代码中的 XML 文档和 [McpMeta] 属性。
工具命名空间
所有工具的外部 ID 都使用 dotnet_ 前缀,以避免与其他 MCP 服务发生命名冲突。这符合 MCP 服务互操作性的最佳实践:
示例:
dotnet_project- 项目生命周期操作(创建/生成/测试/运行/发布)dotnet_package- NuGet 包和项目引用dotnet_solution- 解决方案操作dotnet_sdk- SDK/运行时/模板/框架元数据
发现元数据
工具发现元数据(类别、标签、常用提示)通过 [McpMeta] 属性提供,并通过 MCP 工具列表呈现。
元数据访问
AI 编排器可以通过以下方式访问服务元数据:
- MCP 协议:通过 MCP SDK 获取标准工具/资源列表
- server.json:用于注册和发现的静态元数据文件
- 工具属性:通过代码中的
McpMeta属性获取运行时元数据
如需了解详细的集成示例,请参阅 MCP 规范 和我们的 SDK 集成文档。
参与贡献
欢迎贡献!这是一个由社区维护的项目。
贡献方式:
- 🐛 通过 GitHub Issues 报告错误或提出功能请求
- 💡 提交拉取请求,添加新工具或改进现有功能
- 📝 改进文档
- ⭐ 为仓库点亮 Star,以示支持
开发环境设置:
- Fork 仓库
- 克隆你的 Fork
- 创建功能分支
- 进行修改
- 充分测试
- 提交拉取请求
开发指南请参阅 .github/copilot-instructions.md。
故障排查
“找不到 dnx”
- 原因:未安装 .NET 10 SDK
- 解决方案:安装 .NET 10 SDK,或使用
dotnet run手动配置
“未找到模板”
- 原因:未安装 .NET SDK 模板
- 解决方案:运行
dotnet new --install安装默认模板
“服务无响应”
- 原因:服务崩溃或启动失败
- 解决方案:检查 MCP 客户端中的日志,确保 .NET SDK 位于 PATH 中
运行测试时出现“无法识别选项 '--project'”或“未知开关”
- 原因:测试运行器不匹配或 SDK 版本不兼容
- 背景:
--project标志仅受 Microsoft Testing Platform (MTP) 支持。旧版 VSTest 运行器使用位置参数。 - 解决方案:MCP 服务现在会根据
global.json自动检测测试运行器:- 自动模式(默认):如果使用 MTP,将
{ "test": { "runner": "Microsoft.Testing.Platform" } }添加到global.json;否则默认使用 VSTest - 显式模式:调用
dotnet_projectTest 操作时,设置testRunner: "MicrosoftTestingPlatform"或testRunner: "VSTest" - 旧版参数:使用
useLegacyProjectArgument: true(已弃用,请改用testRunner: "VSTest")
- 自动模式(默认):如果使用 MTP,将
- 验证支持情况:运行
dotnet test --help | grep -- --project,检查 SDK 是否支持--project标志 - 更多信息:查看 doc/testing.md,了解测试运行器兼容性和故障排除的详细信息
- 参考资料:dotnet test 概述 | MTP | VSTest
需要帮助?
- 📖 查看文档
- 💬 提交 GitHub Issue
- 🔍 搜索现有问题
相关 Microsoft MCP 服务
此 .NET MCP 服务专注于 .NET SDK 操作(构建、运行、测试、模板、SDK 管理)。对于特定场景,可考虑使用以下 Microsoft 官方 MCP 服务作为补充:
- NuGet MCP Server - 高级 NuGet 包搜索、元数据查询,以及超出基本包管理范围的自动化场景
- Aspire MCP Server - 为 .NET Aspire 应用提供运行时监控、遥测、分布式跟踪和资源管理
这些 MCP 服务与 .NET MCP 配合使用,可全面覆盖 .NET 开发生命周期:
| 功能 | .NET MCP | NuGet MCP | Aspire MCP |
|---|---|---|---|
| 主要用途 | .NET SDK 操作 | 包元数据/发现 | 运行时监控 |
| 范围 | CLI 命令(构建、运行、测试) | NuGet 搜索与自动化 | Aspire 应用遥测 |
| 阶段 | 开发时 | 开发/发现时 | 运行时/生产环境 |
| 操作示例 | dotnet build、dotnet new | 包搜索、README | 日志查看、跟踪 |
许可证
MIT 许可证 - 详情请参见 LICENSE 文件。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。