/ 目录 / 演练场 / C# SDK
● 官方 modelcontextprotocol ⚡ 即开即用

C# SDK

作者 modelcontextprotocol · modelcontextprotocol/csharp-sdk

用 .NET 构建 MCP 服务器和客户端——由 MCP 团队和微软共同维护的官方 SDK。

官方 modelcontextprotocol/csharp-sdk。用 [McpServerToolType][McpServerTool] 等属性编写 MCP 服务器,或构建连接到任何 MCP 服务器的客户端。与 .NET 依赖注入、日志记录和宿主自然集成。

为什么要用

核心特性

实时演示

实际使用效果

csharp-sdk.replay ▶ 就绪
0/0

安装

选择你的客户端

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

打开 Claude Desktop → Settings → Developer → Edit Config。保存后重启应用。

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

Cursor 使用与 Claude Desktop 相同的 mcpServers 格式。项目级配置优先于全局。

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

点击 Cline 侧栏中的 MCP Servers 图标,然后选 "Edit Configuration"。

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "csharp-sdk": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  }
}

格式与 Claude Desktop 相同。重启 Windsurf 生效。

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "csharp-sdk",
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "./MyMcpServer"
      ]
    }
  ]
}

Continue 使用服务器对象数组,而非映射。

~/.config/zed/settings.json
{
  "context_servers": {
    "csharp-sdk": {
      "command": {
        "path": "dotnet",
        "args": [
          "run",
          "--project",
          "./MyMcpServer"
        ]
      }
    }
  }
}

加入 context_servers。Zed 保存后热重载。

claude mcp add csharp-sdk -- dotnet run --project ./MyMcpServer

一行命令搞定。用 claude mcp list 验证,claude mcp remove 卸载。

使用场景

实战用法: C# SDK

构建一个 .NET MCP 服务器,暴露你现有的服务

👤 拥有内部 API 的 C#/.NET 工程师 ⏱ ~45 min intermediate

何时使用: 你在用 .NET,想要向代理暴露业务逻辑而无需重写。

前置条件
  • .NET 8+ SDKdotnet --version
步骤
  1. 创建项目
    dotnet new console -n MyMcpServer。添加 ModelContextProtocol NuGet。对 MCP 使用最小宿主模板。✓ 已复制
    → csproj 和 Program.cs,包含 MCP 宿主服务
  2. 添加工具
    创建一个带有 [McpServerToolType] 的静态类。添加一个用 [McpServerTool(Description="...")] 装饰的方法 GetOrder(string id),该方法通过 DI 调用我现有的 OrderService。✓ 已复制
    → 工具编译,描述来自属性
  3. 用 inspector 测试
    以 stdio 方式运行服务器。通过 npx @modelcontextprotocol/inspector dotnet run 启动 MCP Inspector。调用 GetOrder。✓ 已复制
    → 工具调用返回 order JSON

结果: 一个完整的、类型安全的 MCP 服务器,复用你现有的 .NET 服务和 DI 容器。

注意事项
  • 作为类上实例方法的工具方法需要 DI 才能工作 — 在 ServiceCollection 中注册包含该方法的类;SDK 通过 DI 解析
  • 没有正确取消令牌的异步方法在关闭时会挂起 — 在每个工具方法上接受 CancellationToken ct 作为最后一个参数——SDK 会自动注入

构建一个使用 MCP 服务器的 .NET 控制台应用

👤 开发内部自动化的 C# 工程师 ⏱ ~30 min intermediate

何时使用: 你想要调用 MCP 服务器的确定性 .NET 代码(不是 LLM 循环)——例如使用 github + filesystem MCP 的定时作业。

步骤
  1. 添加客户端包
    创建一个控制台应用。引用 ModelContextProtocol 客户端。添加指向 stdio 服务器的配置(如 npx -y @modelcontextprotocol/server-github)。✓ 已复制
    → 客户端成功构建
  2. 连接并调用
    启动客户端,列出工具,用我的组织名称调用 list_repositories。打印结果。✓ 已复制
    → 仓库列表打印到控制台
  3. 包装为定时作业
    将其转换为每晚运行的 Worker Service。通过 ILogger 记录指标。✓ 已复制
    → Worker 通过 dotnet run 运行并正常调度

结果: MCP 作为库,不仅仅是聊天插件——在任何 .NET 进程内工作。

注意事项
  • Stdio 服务器需要时间启动,第一次调用超时 — 在应用启动时初始化客户端并重用;不要每次调用都创建新的

从 ASP.NET Core 应用提供 MCP 端点

👤 .NET 平台工程师 ⏱ ~60 min advanced

何时使用: 你想要 MCP 服务器托管在现有 ASP.NET Core 应用内,共享相同的身份验证和入口。

前置条件
  • 现有的 ASP.NET Core 应用或可以新建一个dotnet new web
步骤
  1. 添加 MCP 服务和端点
    在 Program.cs 中,调用 builder.Services.AddMcpServer().WithToolsFromAssembly()。然后调用 app.MapMcp('/mcp')✓ 已复制
    → /mcp 端点响应 SSE 握手
  2. 与应用其余部分共享身份验证
    /mcp 端点放在我现有的 JWT 承载身份验证中间件后面。验证未认证的请求返回 401。✓ 已复制
    → 401 未认证,200 已认证
  3. 部署并连接
    部署应用。通过 mcp-remote https://myapp.com/mcp 和他们的 JWT 连接团队成员的 Claude Desktop。✓ 已复制
    → 团队成员看到工具

结果: MCP 与你的现有 API 在一次部署中上线,统一的身份验证策略。

注意事项
  • Kestrel 在反向代理后缓冲 SSE 响应 — 禁用响应缓冲;确保前面的 IIS/nginx/Cloudflare 也为 /mcp 禁用缓冲
搭配使用: cloud-run

组合

与其他 MCP 搭配,撬动十倍杠杆

csharp-sdk + cloud-run

在 Cloud Run 上部署 .NET MCP 服务器以及其他微服务

将我的 .NET MCP 服务器容器化(mcr.microsoft.com/dotnet/aspnet 基础),部署到 Cloud Run,min-instance=1 以缓解冷启动。✓ 已复制
csharp-sdk + fastmcp

多语言组织的选择——使用不同 SDK,遵循相同协议

我们的团队既有 Python 也有 .NET 服务。对 Python API 使用 FastMCP,对 .NET API 使用 csharp-sdk——两者都在一个 ContextForge 网关后面。✓ 已复制

工具

此 MCP 暴露的能力

工具输入参数何时调用成本
[McpServerToolType] 类上的属性 标记其方法应该被暴露的类 free
[McpServerTool(Description)] 方法上的属性 标记你想要代理调用的每个方法 free
AddMcpServer() / WithToolsFromAssembly() 流畅构建器 在 Program.cs 的启动时 free
MapMcp('/path') ASP.NET 端点 仅限 ASP.NET 托管 free
IMcpClient stdio 或 SSE 传输配置 在客户端使用 free

成本与限制

运行它的成本

API 配额
无——这是一个 SDK
每次调用 Token 数
除了 MCP 协议外没有框架开销
费用
免费,MIT 许可证
提示
使用 .NET 的内置日志记录和 HealthChecks,在问题扩大前及时发现

安全

权限、密钥、影响范围

凭据存储: 标准 .NET:开发用 user-secrets,生产用环境变量或 Key Vault
数据出站: 工具能访问的任何资源

故障排查

常见错误与修复

工具未出现在 inspector 中

WithToolsFromAssembly() 仅扫描执行程序集。对于引用库中的工具,显式传递程序集:WithTools(typeof(MyTools).Assembly)

DI 无法在工具方法中解析我的服务

工具类型必须在容器中注册。在 AddMcpServer 之前添加 builder.Services.AddScoped<OrderService>()

ASP.NET MapMcp 返回 404

你在 app.Run() 之后映射了——将 MapMcp 移到 Run 之前。还要检查路径是否与其他端点冲突。

JSON 序列化在枚举上失败

SDK 使用 System.Text.Json;在你的枚举上添加 [JsonStringEnumConverter] 或全局配置。

替代方案

C# SDK 对比其他方案

替代方案何时用它替代权衡
FastMCP (Python)你可以学习 Python——更丰富的示例生态系统不同的语言;取决于团队技能
TypeScript MCP SDKNode / TS 技术栈相似的开发体验,语言选择

更多

资源

📖 阅读 GitHub 上的官方 README

🐙 查看未解决的 issue

🔍 浏览全部 400+ MCP 服务器和 Skills