这是一个非常具体且前沿的技术组合,是当前 AI Agent 领域中非常先进的实践模式,它实现了 大语言模型 (LLM) 的 工具调用 (Function Calling) 能力与 外部实时数据源 的安全、标准化集成。
🌩️ 天气查询系统架构概览
该系统将遵循 MCP 客户端-服务器 模型,其中 DeepSeek 作为 LLM 充当决策者,FastMCP 搭建的服务器充当实际的数据执行者。
| 组件 | 角色定位 | 核心技术 | 职责描述 |
|---|---|---|---|
| LLM (DeepSeek) | AI Agent / 决策者 | DeepSeek/Claude/GPT-4 等 LLM | 分析用户查询,根据 MCP 服务器提供的工具描述,决定是否调用工具以及调用哪个工具(Function Calling)。 |
| MCP Client (宿主应用) | 协议中介 | Claude Desktop / Cursor IDE / 自定义 Client | 连接 FastMCP 服务器,将 LLM 的工具调用请求转发给服务器,并将服务器的返回结果反馈给 LLM。 |
| MCP Server (天气服务) | 执行者 / 数据抽象层 | FastMCP (基于 Python) | 监听客户端请求,封装对外部天气 API (如 OpenWeatherMap) 的调用逻辑,并将结果以标准格式返回。 |
| Data Source | 实时数据源 | OpenWeatherMap / NWS API / 和风天气 | 提供实际的实时天气数据和预报信息。 |
1. FastMCP 天气服务器 (weather_server.py)
这个文件定义了 LLM 可以调用的天气查询工具。
import httpx
import uvicorn
import os
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, Field
from starlette.applications import Starlette
# --- 配置 ---
# ⚠️ 替换为您的实际天气 API Key
# 推荐使用 OpenWeatherMap 或其他支持城市名查询的 API
WEATHER_API_KEY = "YOUR_OPENWEATHERMAP_KEY"
WEATHER_API_BASE = "https://api.openweathermap.org/data/2.5"
SERVER_HOST = "127.0.0.1"
SERVER_PORT = 8080
# 1. 初始化 FastMCP 服务器
mcp = FastMCP("weather_service")
# 2. 定义工具的输入参数
class GetWeatherInput(BaseModel):
"""获取当前天气预报的输入模型。"""
city: str = Field(description="需要查询天气的城市名称,例如:'北京', 'Shanghai', 'London'。")
# 3. 定义 MCP 工具
@mcp.tool()
async def get_current_weather(input: GetWeatherInput) -> str:
"""
根据城市名称获取当前的详细天气状况,包括温度、湿度、风速和天气描述。
LLM应该在用户询问天气时调用此工具。
:param input: 包含城市名称的输入模型。
:return: 格式化的天气信息字符串。
"""
city = input.city
# 构造 API URL (使用 metric 单位和中文语言)
url = (
f"{
WEATHER_API_BASE}/weather?q={
city}&appid={
WEATHER_API_KEY}"
f"&units=metric&lang=zh_cn"
)
if WEATHER_API_KEY == "YOUR_OPENWEATHERMAP_KEY":
return "错误:请在 weather_server.py 中设置 WEATHER_API_KEY。"
try:
# 使用 httpx 异步发送请求
async with httpx.AsyncClient(timeout=10.0) as client:
response = await client.get(url)
response.raise_for_status() # 抛出 4xx/5xx 错误
data = response.json()
# 提取并格式化关键天气数据
if data.get('cod') == 200:
main = data.get('main', {
})
weather = data.get('weather', [

最低0.47元/天 解锁文章
1682

被折叠的 条评论
为什么被折叠?



