天气数据服务演示

一个展示MCP客户端-服务器架构的天气数据服务演示,通过HTTP/SSE传输实现实时天气数据获取和工具调用。

  • by LakshmanSurampudi
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 LakshmanSurampudi/my_mcp_demo

使用说明

MCP天气演示

使用HTTP/SSE传输的模型上下文协议(MCP)客户端-服务器架构的实际演示。

概述

此演示展示了:

  • MCP服务器:通过HTTP/SSE公开天气工具
  • MCP客户端:连接到服务器、发现工具并执行请求
  • 现实世界一体化:从wttr.in API获取实时天气数据
  • 协议透明度:详细模式显示实际的JSON-RPC消息

建筑

┌─────────────────────┐         HTTP/SSE          ┌──────────────────────┐
│  weather_client.py  │  ←-------------------→    │  weather_server.py   │
│    (MCP Client)     │                           │    (MCP Server)      │
└─────────────────────┘                           └──────────────────────┘
         ↓                                                  ↓
    User Terminal                                    wttr.in API

通信流

  1. SSE连接:客户端为服务器响应建立持久连接
  2. HTTP POST:客户端向发送JSON-RPC请求 /message 端点
  3. 工具发现:客户端列出可用的工具和模式
  4. 工具执行:客户端使用参数调用工具
  5. 响应处理:服务器通过SSE流发送结果

先决条件

  • Python 3.10或更高版本
  • 互联网连接(适用于天气API)
  • 两个终端窗口

安装

终端1-服务器设置

cd server
pip install -r requirements.txt

终端2-客户端设置

cd client
pip install -r requirements.txt

运行演示

步骤1:启动服务器

在 端子1:

cd server
python weather_server.py

您应该看到:

🌤️  MCP Weather Server
==================================================
Server starting on http://localhost:8000
SSE endpoint: http://localhost:8000/sse
Message endpoint: http://localhost:8000/message
==================================================

Waiting for client connections...

步骤2:运行客户端

在 2号航站楼:

cd client
python weather_client.py

对于详细模式(显示JSON-RPC消息):

python weather_client.py --verbose

演示显示了什么

1.连接生命周期

  • 客户端通过SSE连接到服务器
  • 使用协议版本初始化握手
  • 服务器返回功能

2.工具发现

  • 客户端请求可用工具列表
  • 服务器返回带有参数的工具架构

3.工具执行示例

  • 当前天气:获取伦敦的温度、条件、湿度
  • 预测:获取东京3天天气预报
  • 多个查询:班加罗尔的额外天气要求

4.JSON-RPC协议(详细模式)

请求示例:

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "get_current_weather",
    "arguments": {"city": "London"}
  },
  "id": 1
}

示例响应:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Current Weather in London:\nTemperature: 8°C (46°F)..."
      }
    ]
  }
}

可用工具

1.get_current_weather

  • 描述:获取城市的当前天气状况
  • 参数:
    • city (字符串,必填):城市名称

2.获取预测

  • 描述:获取一个城市的天气预报
  • 参数:
    • city (字符串,必填):城市名称
    • days (整数,必填):天数(1-3)

技术细节

MCP协议版本

  • 版本: 2024-11-05
  • 运输:HTTP和SSE用于流式传输

传输机制

HTTP POST (/message 端点):

  • 客户端到服务器的请求
  • JSON-RPC 2.0格式
  • 请求/响应模式

上海证券交易所 (/sse 端点):

  • 服务器到客户端的响应
  • 持久连接
  • 实时消息传递

关键组件

服务器 (weather_server.py):

  • FastAPI/Starlette web框架
  • MCP服务器装饰器(@server.list_tools(), @server.call_tool())
  • 天气API异步HTTP客户端
  • SSE连接管理

客户端 (weather_client.py):

  • 支持SSE的HTTP客户端
  • 请求/响应相关性的消息ID跟踪
  • 用于响应处理的异步队列
  • 用于教育目的的详细记录

故障排除

端口已在使用中

Error: Address already in use

解决方案:使用端口8000终止进程或更改两个文件中的端口。

# Find process
lsof -i :8000

# Kill it
kill -9 <PID>

连接被拒绝

Error: Connection refused

解决方案:启动客户端之前,请确保服务器正在运行。

API超时

Error: Failed to fetch weather data

解决方案:检查互联网连接。wttr.in可能暂时不可用。

扩展演示

添加更多工具

修改 weather_server.py 添加新工具:

@mcp_server.list_tools()
async def list_tools() -> list[Tool]:
    return [
        # ... existing tools ...
        Tool(
            name="your_new_tool",
            description="Your tool description",
            inputSchema={...}
        )
    ]

修改客户端行为

编辑 weather_client.py 自定义:

  • 不同的城市
  • 错误处理
  • 响应格式
  • 其他工具调用

学习资源

关键要点

  1. 关注点分离:客户端和服务器独立运行
  2. 标准协议:JSON-RPC 2.0实现互操作性
  3. 实时通信:SSE启用服务器推送功能
  4. 类型安全:用于参数验证的JSON模式
  5. 生产就绪:体系结构与企业部署相匹配

许可证

麻省理工学院许可证-可出于教育目的免费使用和修改。