肖。MCPSample2
一个全面的示例解决方案,展示了 模型上下文协议(MCP) 用C#实现,具有多种服务器类型和客户端应用程序。
概述
此解决方案展示了三种不同的MCP服务器实现和一个可以连接到所有这些实现的客户端:
- 控制台STDIO MCP服务器 -使用标准输入/输出进行MCP通信
- Web SSE MCP服务器 -使用HTTP进行服务器发送事件传输
- Web HTTP MCP服务器 -使用流式HTTP传输
- MCP客户端 -连接到所有服务器类型的交互式控制台应用程序
建筑
┌─────────────────┐ ┌──────────────────────┐
│ MCP Client │ │ Shared MCP Tools │
│ │ │ │
│ - Interactive │ │ - GetRandomNumber │
│ - Multi-server │ │ - CalculateFactorial │
│ - Transport │ │ - IsPrime │
│ demos │ │ - ReverseString │
│ - OAuth 2.1 │ │ - GetCurrentTime │
│ PKCE Client │ │ - FormatDate │
└─────────────────┘ │ - CalculateDistance │
│ │ - GenerateFibonacci │
│ └──────────────────────┘
▼ ▲
┌─────────────────┐ │
│ OAuth 2.1 │ │
│ Protected │ │
│ MCP Servers │ │
│ │ │
│ ├ Console STDIO │──────────────┤ (No OAuth)
│ ├ Web SSE │──────────────┤ (OAuth 2.1)
│ └ Web HTTP │──────────────┘ (OAuth 2.1)
└─────────────────┘项目
1.鞋子。MCPSample2.Server。控制台
控制台STDIO MCP服务器
- 传输:标准输入/输出(STDIO)
- 端口:N/A(使用STDIN/STDOUT)
- 用途:直接过程通信
- 最适合:本地集成、CLI工具、GitHub Copilot
2.鞋子。MCPSample2.Server。WebSSE
使用OAuth 2.1的Web SSE MCP服务器
- 传输:HTTP与服务器发送的事件
- 端口:5001(HTTP),7001(HTTPS)
- 端点:
/api/mcp(OAuth 2.1受保护) - OAuth:使用PKCE的授权代码流
- 最适合:实时web应用程序、持久连接
3.鞋子。MCPSample2.Server。WebHTTP
基于OAuth 2.1的Web HTTP MCP服务器
- 传输:流式HTTP
- 端口:5002(HTTP),7002(HTTPS)
- 端点:
/api/mcp(OAuth 2.1受保护) - OAuth:使用PKCE的授权代码流
- 最适合:类似REST的集成、无状态连接
4.鞋子。MCPSample2.客户端
支持OAuth 2.1的MCP客户端应用程序
- 交互式控制台应用程序
- 连接到所有三种服务器类型
- 演示不同的运输方法
- 显示服务器功能和运行状况检查
- OAuth 2.1 PKCE客户端实现
- 测试OAuth授权流
5.鞋子。MCPSample2.共享
共享库
- 所有服务器使用的通用MCP工具
- 演示各种工具类型:
- 数学的:随机数、阶乘、素数检验、斐波那契 - 字符串操作:反向字符串 - 日期/时间:当前时间、日期格式 - 几何的:距离计算
可用的MCP工具
所有服务器通过共享库公开相同的工具集:
| 工具 | 说明 | 参数 |
|---|---|---|
GetRandomNumber | 生成随机数 | min (int), max (int) |
CalculateFactorial | 计算阶乘 | number (int) |
IsPrime | 检查数字是否为素数 | number (int) |
ReverseString | 反转字符串 | input (字符串) |
GetCurrentTime | 获取当前UTC时间 | 无 |
FormatDate | 格式化日期字符串 | date (日期时间), format (字符串) |
CalculateDistance | 计算二维距离 | x1, y1, x2, y2 (双) |
GenerateFibonacci | 生成斐波那契数列 | count (int) |
快速开始
先决条件
运行应用程序
- 克隆和构建:
git clone https://github.com/Fujiwo/Shos.MCPSample2.git
cd Shos.MCPSample2
dotnet build- 启动MCP客户端:
cd Shos.MCPSample2.Client
dotnet run- 启动单个服务器 (在单独的终端中):
控制台STDIO服务器:
cd Shos.MCPSample2.Server.Console
dotnet run网络SSE服务器:
cd Shos.MCPSample2.Server.WebSSE
dotnet run
# Server starts at: http://localhost:5001Web HTTP服务器:
cd Shos.MCPSample2.Server.WebHTTP
dotnet run
# Server starts at: http://localhost:5002测试服务器
控制台STDIO服务器
STDIO服务器通过标准输入/输出进行通信。它的设计用途是:
- 可以启动流程的MCP客户端
- GitHub Copilot(正确配置后)
- 支持MCP的其他开发工具
Web服务器(SSE和HTTP)
两个web服务器都提供:
- MCP端点:
/api/mcp - 健康检查:
/weatherforecast - Swagger用户界面:
/swagger(处于开发模式)
测试web服务器:
# Health check
curl http://localhost:5001/weatherforecast # SSE server
curl http://localhost:5002/weatherforecast # HTTP server
# Access Swagger UI
open http://localhost:5001/swagger # SSE server
open http://localhost:5002/swagger # HTTP serverMCP客户端使用情况
客户端应用程序提供了一个支持OAuth 2.1的交互式菜单:
=== MCP Client Sample with OAuth 2.1 ===
Select a server to connect to:
1. Console STDIO MCP Server (No OAuth - Local only)
2. Web SSE MCP Server (HTTP) - OAuth 2.1 Protected
3. Web HTTP MCP Server (HTTP) - OAuth 2.1 Protected
4. Test OAuth 2.1 Flow
5. Exit每个选项都演示了:
- 如何连接到该传输类型
- 可用服务器功能
- 健康检查结果
- OAuth 2.1保护状态
- 服务器未运行时的安装说明
选项4 提供了一个完整的OAuth 2.1 PKCE流程演示,显示:
- OAuth发现
- PKCE挑战生成
- 授权码交换
- 受保护端点的访问令牌使用情况
开发说明
技术栈
- .NET 8.0:目标框架
- 模型上下文协议:官方C#MCP SDK(预览版)
- 模型上下文协议。AspNetCore:ASP。NET核心集成
- 微软。扩展。托管:依赖注入和托管
运输类型
- STDIO传输
- 直接过程沟通 - 使用人: WithStdioServerTransport() - 最适合:本地工具、IDE集成
- HTTP传输(SSE和流式传输)
- 基于网络的通信 - 使用人: WithHttpTransport() - 最适合:Web应用程序、远程服务
架构优势
- 共享工具:所有服务器的通用功能
- 运输灵活性:相同的工具,不同的连接方法
- 可扩展:易于添加新工具或服务器
- 遵从标准:使用官方MCP SDK
OAuth 2.1集成
✅ OAuth 2.1实现现已完成!
MCP web服务器(WebSSE和WebHTTP)现在使用PKCSE(代码交换证明密钥)通过OAuth 2.1授权进行保护,以增强安全性。
OAuth 2.1功能
- PKCE 需要:所有授权流都使用PKCE进行安全保护
- JWT承载代币:访问令牌为JWT格式,具有安全签名
- 发现端点:标准OAuth发现位于
/.well-known/oauth-authorization-server - 授权码流:标准OAuth 2.1授权代码流
- MCP保护:MCP端点需要有效的承载令牌
OAuth 2.1端点
这两个web服务器都公开了以下OAuth端点:
| 终点 | 目的 |
|---|---|
/.well-known/oauth-authorization-server | OAuth发现信息 |
/oauth/authorize | 授权端点(需要PKCE) |
/oauth/token | 令牌交换端点 |
/api/mcp | 受保护的MCP端点(需要Bearer令牌) |
测试OAuth 2.1
- 启动web服务器:
cd Shos.MCPSample2.Server.WebSSE
dotnet run # Starts on http://localhost:5001- 使用OAuth测试运行客户端:
cd Shos.MCPSample2.Client
dotnet run
# Select option 4: "Test OAuth 2.1 Flow"- 手动OAuth流测试:
# Discovery
curl http://localhost:5001/.well-known/oauth-authorization-server
# Test protected endpoint (should return 401)
curl -I http://localhost:5001/api/mcp
# Generate PKCE challenge and test full flow
# (See client implementation for complete example)OAuth 2.1配置
OAuth设置已在中配置 appsettings.json:
{
"OAuth": {
"Issuer": "https://localhost:7001",
"Audience": "mcp-api",
"AccessTokenExpirationMinutes": 60,
"DefaultClientId": "mcp-sample-client",
"DefaultRedirectUri": "http://localhost:8080/callback"
}
}安全说明:JWT签名密钥目前是硬编码的,用于演示目的。在生产环境中,使用安全密钥管理(Azure密钥库等)。
贡献
这是一个演示MCP概念的示例/教育项目。您可以将其作为您自己的MCP实现的起点。
许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
