/ 目錄 / 演練場 / C# SDK
● 官方 modelcontextprotocol ⚡ 即開即用

C# SDK

作者 modelcontextprotocol · modelcontextprotocol/csharp-sdk

在 .NET 上建構 MCP 伺服器與客戶端——由 MCP 團隊與 Microsoft 共同維護的官方 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,且希望在不重寫程式的情況下將商業邏輯公開給 Agent 使用。

前置條件
  • .NET 8+ SDKdotnet --version
步驟
  1. 建立專案
    dotnet new console -n MyMcpServer。新增 ModelContextProtocol NuGet 套件。使用 MCP 的最小託管範本。✓ 已複製
    → csproj + Program.cs 內含 MCP hosted service
  2. 新增工具
    建立一個帶有 [McpServerToolType] 的靜態類別。加入以 [McpServerTool(Description="...")] 裝飾的 GetOrder(string id) 方法,透過 DI 呼叫現有的 OrderService。✓ 已複製
    → 工具可編譯,描述來自屬性
  3. 使用 Inspector 測試
    以 stdio 模式執行伺服器。透過 npx @modelcontextprotocol/inspector dotnet run 啟動 MCP Inspector,呼叫 GetOrder。✓ 已複製
    → 工具呼叫回傳訂單 JSON

結果: 一個已編譯、具強型別的 MCP 伺服器,可重複使用現有的 .NET 服務與 DI 容器。

注意事項
  • 工具方法若為類別的實例方法,需要 DI 才能運作 — 在 ServiceCollection 中註冊該類別;SDK 會透過 DI 進行解析
  • 非同步方法若缺少適當的取消權杖,會在關閉時卡住 — 在每個工具的最後一個參數加入 CancellationToken ct——SDK 會自動注入

建構一個使用 MCP 伺服器的 .NET 主控台應用程式

👤 建構內部自動化工具的 C# 開發者 ⏱ ~30 min intermediate

何時使用: 你希望用確定性的 .NET 程式碼(而非 LLM 迴圈)呼叫 MCP 伺服器——例如,定期執行的排程工作,使用 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 Bearer 驗證中介軟體之後。確認未驗證的請求會收到 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

將 .NET MCP 伺服器與其他微服務一同部署至 Cloud Run

將我的 .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] attribute on a class 標記其方法需公開為工具的類別 free
[McpServerTool(Description)] attribute on a method 每個你希望 Agent 可呼叫的方法 free
AddMcpServer() / WithToolsFromAssembly() fluent builder 在 Program.cs 啟動時呼叫 free
MapMcp('/path') ASP.NET endpoint 僅限 ASP.NET 託管使用 free
IMcpClient stdio or SSE transport config 客戶端呼叫其他 MCP 伺服器時使用 free

成本與限制

運行它的成本

API 配額
無——這是一個 SDK
每次呼叫 Token 數
除 MCP 協定本身外,無任何框架額外開銷
費用
免費,MIT 授權
提示
善用 .NET 內建的日誌記錄與 HealthChecks,在問題影響正式環境前及早發現

安全

權限、密鑰、影響範圍

憑證儲存: 標準 .NET 做法:開發環境使用 user-secrets,正式環境使用環境變數或 Key Vault
資料出站: 取決於你的工具所存取的範圍

故障排查

常見錯誤與修復

Tool not appearing in inspector

WithToolsFromAssembly() 只會掃描目前執行的組件。若工具位於參考的函式庫中,請明確傳入組件:WithTools(typeof(MyTools).Assembly)

DI can't resolve my service in a tool method

工具類別必須在容器中完成註冊。在 AddMcpServer 之前加入 builder.Services.AddScoped<OrderService>()

ASP.NET MapMcp returns 404

你在 app.Run() 之後才呼叫 MapMcp——請將 MapMcp 移至 Run 之前。同時確認路徑與其他端點沒有衝突。

JSON serialization fails on enums

SDK 使用 System.Text.Json;請在你的列舉上加入 [JsonStringEnumConverter],或進行全域設定。

替代方案

C# SDK 對比其他方案

替代方案何時用它替代權衡
FastMCP (Python)你可以接受使用 Python——範例生態系更豐富不同語言;取決於團隊技能
TypeScript MCP SDKNode / TS 技術棧開發體驗相近,差異在於語言選擇

更多

資源

📖 閱讀 GitHub 上的官方 README

🐙 查看未解決的 issue

🔍 瀏覽全部 400+ MCP 伺服器和 Skills