配备Azure Redis HybridCache的天气MCP服务器
一种模型上下文协议(MCP)服务器,使用提供企业级缓存的天气数据生成。NET HybridCache和具有Entra ID身份验证的Azure Redis。
🌟 特性
- AI代理集成:具有天气功能的笑话助理
- 智能缓存:具有内存L1和Azure Redis L2的多层缓存
- 安全认证:Azure Entra ID身份验证(无连接字符串!)
- 确定性天气:同一城市/日期总是返回一致的天气数据
- 踩踏保护:防止重复的缓存生成请求
- 基于标签的无效化:使用标签进行有组织的缓存管理
🏗️ 建筑
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ MCP Client │───▶│ MCP Server │───▶│ Azure OpenAI │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐
│ HybridCache │
│ ┌─────────────┐ │
│ │ L1: Memory │ │ (30 min)
│ └─────────────┘ │
│ ┌─────────────┐ │
│ │ L2: Redis │ │ (6 hours)
│ └─────────────┘ │
└──────────────────┘
│
▼
┌─────────────────────────┐
│ Azure Redis Cache │
│ (Entra ID Auth) │
└─────────────────────────┘🚀 快速开始
先决条件
- .NET 10.0或更高版本
- Azure CLI已安装并通过身份验证(
az login) - 启用Entra ID访问Azure Redis缓存
安装
- 克隆存储库:
git clone https://github.com/CawaMS/weather-mcp-redis.git
cd weather-mcp-redis- 恢复依赖关系:
dotnet restore- 配置Azure Redis:
更新Redis主机名 Program.cs:
var redisHostName = "your-redis-instance.centraluseuap.redis.azure.net:10000";- 构建项目:
dotnet build- 运行MCP服务器:
dotnet run📦 依赖项
| 包装 | 版本 | 用途 |
|---|---|---|
Microsoft.Extensions.Caching.Hybrid | 9.10.0 | 多层缓存 |
Microsoft.Extensions.Caching.StackExchangeRedis | 9.0.10 | Redis集成 |
Microsoft.Azure.StackExchangeRedis | 3.3.0 | 带有Entra ID的Azure Redis |
Azure.Identity | 1.17.0 | Azure身份验证 |
Microsoft.Agents.AI.OpenAI | 1.0.0-预览 | AI代理框架 |
ModelContextProtocol | 0.4.0-审查。3 | MCP服务器实现 |
🔧 配置
HybridCache设置
builder.Services.AddHybridCache(options =>
{
options.MaximumPayloadBytes = 1024 * 1024; // 1MB max payload
options.MaximumKeyLength = 1024; // 1KB max key length
options.DefaultEntryOptions = new HybridCacheEntryOptions
{
Expiration = TimeSpan.FromHours(6), // L2 Redis cache
LocalCacheExpiration = TimeSpan.FromMinutes(30) // L1 Memory cache
};
});Azure Redis配置
服务器自动为Azure Redis配置Entra ID身份验证:
var configurationOptions = ConfigurationOptions.Parse(redisHostName);
await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new AzureCliCredential());🌤️ 天气工具使用
MCP功能调用
{
"name": "GenerateWeatherAsync",
"arguments": {
"city": "Seattle",
"date": "2024-03-15"
}
}响应示例
{
"City": "Seattle",
"Date": "2024-03-15",
"Condition": "Rainy",
"Temperature": "12°C",
"Humidity": "78%",
"WindSpeed": "18 km/h",
"Pressure": "995 hPa",
"CachedAt": "2025-11-09 23:45:32 UTC",
"CacheInfo": "Cached in Azure Redis with Entra ID auth for 6 hours"
}🔐 安全功能
Entra ID身份验证
- 无连接字符串:使用Azure CLI凭据
- 基于令牌的身份验证:安全、旋转的令牌
- RBAC支持:细粒度访问控制
缓存安全
- 加密传输:所有Redis通信加密
- 孤立实例:每个环境专用Redis实例
- 访问策略:基于Entra ID的访问控制
📊 缓存策略
缓存密钥
weather:{city}:{date}示例:
weather:Seattle:2024-03-15weather:New York:2024-12-25
缓存的标签
weather:所有天气数据city:{cityname}:城市特定数据
缓存失效
// Invalidate all weather data
await cache.RemoveByTagAsync("weather");
// Invalidate specific city
await cache.RemoveByTagAsync("city:Seattle");🏃♂️ 性能特征
| 场景 | 缓存命中率 | 性能 |
|---|---|---|
| 热门数据 (L1命中) | 内存缓存 | ~1ms |
| 温暖的数据 (L2命中) | Redis缓存 | ~10-50ms |
| 冷数据 (缓存未命中) | 生成+缓存 | ~100-200ms |
益处
- 99%以上的缓存命中率 对于重复的请求
- 踩踏保护 防止缓存风暴
- 多区域支持 通过Redis地理复制
- 自动故障转移 Redis的高可用性
🔍 监测和可观察性
缓存指标(可通过Azure Monitor获得)
- 缓存命中率/未命中率
- 请求延迟
- 内存使用
- Redis连接健康状况
日志记录
应用程序通过标准记录缓存操作和性能指标。NET日志框架。
🚀 部署
Azure容器应用
# container-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: weather-mcp-server
spec:
template:
spec:
containers:
- name: weather-mcp
image: weather-mcp:latest
env:
- name: AZURE_CLIENT_ID
value: "your-managed-identity-id"码头工人
FROM mcr.microsoft.com/dotnet/aspnet:10.0
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "dotnet-agent-mcp.dll"]🔧 发展
地方发展设置
- 安装Azure命令行界面:
# Windows
winget install Microsoft.AzureCLI
# macOS
brew install azure-cli- 登录到Azure:
az login- 设置Redis权限:
# Add your user to Redis data owner role
az role assignment create \
--assignee your-email@domain.com \
--role "Redis Cache Contributor" \
--scope /subscriptions/{subscription-id}/resourceGroups/{rg}/providers/Microsoft.Cache/Redis/{redis-name}测试缓存功能
// Test cache hit
var result1 = await GenerateWeatherAsync("Seattle", "2024-03-15");
var result2 = await GenerateWeatherAsync("Seattle", "2024-03-15");
// result1 == result2 (cached)
// Test cache miss
var result3 = await GenerateWeatherAsync("Portland", "2024-03-15");
// Different city = cache miss = new data generation📚 其他资源
🤝 贡献
- 分叉存储库
- 创建要素分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
📄 许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
🆘 支持
有关支持和问题:
- 创建一个 问题
- 检查 Azure Redis文档
- 审查 HybridCache故障排除指南
______________________________________________________________________
内置于❤️ 使用。NET 10、Azure Redis和HybridCache
