使用说明
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
通信流
- SSE连接:客户端为服务器响应建立持久连接
- HTTP POST:客户端向发送JSON-RPC请求
/message端点 - 工具发现:客户端列出可用的工具和模式
- 工具执行:客户端使用参数调用工具
- 响应处理:服务器通过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 自定义:
- 不同的城市
- 错误处理
- 响应格式
- 其他工具调用
学习资源
关键要点
- 关注点分离:客户端和服务器独立运行
- 标准协议:JSON-RPC 2.0实现互操作性
- 实时通信:SSE启用服务器推送功能
- 类型安全:用于参数验证的JSON模式
- 生产就绪:体系结构与企业部署相匹配
许可证
麻省理工学院许可证-可出于教育目的免费使用和修改。