内容
# MCP 服务器 — C# / .NET 9
本仓库中Python (`mcp`/FastMCP)和TypeScript (`@modelcontextprotocol/sdk`) MCP服务器实现的C#转换。
所有项目均以 **.NET 9** 为目标,并使用官方的 [`ModelContextProtocol`](https://www.nuget.org/packages/ModelContextProtocol) NuGet SDK。
## 前置条件
- [.NET 9 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)
---
## 如何构建
从此文件夹中一次性构建所有项目:
```bash
dotnet build Mcp.sln
```
或构建单个项目:
```bash
dotnet build Mcp.Basic/Mcp.Basic.csproj
```
---
## 如何运行
### 标准输入/输出服务器(Basic、WithResources、WithPrompts)
这些服务器通过标准输入/输出进行通信,旨在由MCP客户端(例如Claude Desktop、VS Code Copilot)启动。
**直接运行:**
```bash
dotnet run --project Mcp.Basic
dotnet run --project Mcp.WithResources
dotnet run --project Mcp.WithPrompts
```
**Claude Desktop / MCP 客户端配置 (`mcp.json`):**
```json
{
"mcpServers": {
"binance-basic": {
"command": "dotnet",
"args": ["run", "--project", "C:/Code/mcp-experiments/csharp_mcp/Mcp.Basic"]
},
"binance-full": {
"command": "dotnet",
"args": ["run", "--project", "C:/Code/mcp-experiments/csharp_mcp/Mcp.WithPrompts"]
}
}
}
```
为了生产环境,首先发布以加快启动速度:
```bash
dotnet publish Mcp.WithPrompts -c Release -o ./publish/WithPrompts
```
然后将客户端指向已发布的`.exe`。
### HTTP 服务器(Mcp.Http)
```bash
dotnet run --project Mcp.Http
```
服务器启动于 `http://0.0.0.0:8000`。MCP客户端连接到 `http://localhost:8000/mcp`。
---
## MCP 原语映射
### 工具(所有项目)
| C# 方法 | MCP 工具名称 | 描述 |
|---|---|---|
| `Tools.GetPrice` | `get_price` | 当前价格 |
| `Tools.GetPricePriceChange` | `get_price_price_change` | 24小时价格变化 |
### 资源(WithResources、WithPrompts)
| URI | 描述 |
|---|---|
| `file://activity.log` | 所有 `get_price` 调用日志 |
| `resource://crypto_price/{symbol}` | 任意符号的实时价格 |
### 提示(仅WithPrompts)
| 提示名称 | 参数 | 描述 |
|---|---|---|
| `executive_summary` | _(无)_ | BTC + ETH 执行摘要 |
| `crypto_summary` | `crypto` | 任意加密资产摘要 |
---
## Python → C# 模式
| Python (FastMCP) | C# (ModelContextProtocol SDK) |
|---|---|
| `@mcp.tool()` 装饰器 | `[McpServerTool]` 属性,应用于 `[McpServerToolType]` 类中的方法 |
| `@mcp.resource("uri")` 装饰器 | `[McpServerResource(UriTemplate="uri")]` 属性 |
| `@mcp.prompt()` 装饰器 | `[McpServerPrompt]` 属性,返回 `ChatMessage` |
| `mcp.run(transport="stdio")` | `.WithStdioServerTransport()` + `Host.RunAsync()` |
| `mcp.run(transport="streamable-http")` | `.WithHttpTransport()` + `app.MapMcp()` |
| `FastMCP(host="0.0.0.0", port=8000)` | `builder.WebHost.UseUrls("http://0.0.0.0:8000")` |