天气数据生成服务器

一个使用.NET HybridCache和Azure Redis的企业级天气数据生成服务器,支持Entra ID认证。

  • by CawaMS
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 CawaMS/weather-mcp-redis

使用说明

配备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缓存

安装

  1. 克隆存储库:

    git clone https://github.com/CawaMS/weather-mcp-redis.git
    cd weather-mcp-redis
    
  2. 恢复依赖关系:

    dotnet restore
    
  3. 配置Azure Redis: 更新Redis主机名 Program.cs:

    var redisHostName = "your-redis-instance.centraluseuap.redis.azure.net:10000";
    
  4. 构建项目:

    dotnet build
    
  5. 运行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-15
  • weather: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"]

🔧 发展

地方发展设置

  1. 安装Azure命令行界面:

    # Windows
    winget install Microsoft.AzureCLI
    
    # macOS  
    brew install azure-cli
    
  2. 登录到Azure:

    az login
    
  3. 设置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

📚 其他资源

🤝 贡献

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 提交您的更改(git commit -m 'Add amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

📄 许可证

此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。

🆘 支持

有关支持和问题:


内置于❤️ 使用。NET 10、Azure Redis和HybridCache