掘金 人工智能 9小时前
超简单,手摸手教你做个mcp,天气查询AI助手
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何使用Model Context Protocol (MCP) 构建一个能够让AI模型调用外部工具的框架。通过搭建天气查询服务 (MCP Server) 和开发调用该服务的AI助手 (MCP Client),逐步演示了MCP的实际应用。文章涵盖了环境准备、代码编写、配置以及进阶应用,例如GitHub仓库管理和Figma设计稿解析。最终,实现了AI模型能够自动识别需求并调用相应工具的功能,提升了AI的实用性和自动化程度。

🔨 **MCP Server构建**:首先,文章详细讲解了如何搭建一个MCP Server,以天气查询服务为例。这包括环境准备、安装必要的Python包,以及编写Python代码来调用OpenWeatherMap API获取天气信息。关键在于使用`@mcp.tool()`装饰器将函数注册为可被AI调用的工具。

🤖 **MCP Client开发**:随后,文章展示了如何开发一个MCP Client,该Client能够与MCP Server交互,并让AI模型自动调用天气查询工具。这包括安装依赖、配置API密钥,以及编写代码来调用OpenAI(或DeepSeek)模型,并配置tools参数,使AI能够理解并使用天气查询工具。

⚙️ **Trae配置**:为了让AI能够实际调用MCP Server,需要在Trae中进行配置。通过在配置文件中指定MCP Server的启动命令,Trae能够启动天气查询服务,并使AI能够通过MCP协议与该服务进行通信,从而实现AI自动调用外部工具的功能。

🚀 **进阶应用与调试**:文章还介绍了MCP的进阶应用,例如扩展到GitHub仓库管理、Figma设计稿解析等。此外,还提到了使用MCP Inspector进行调试的方法,帮助开发者更好地理解AI调用工具的过程,并解决可能出现的问题。

引言

嗯,大家好呀!今天咱们来聊聊 MCP(Model Context Protocol) 的开发,从搭建一个简单的天气查询Server,再到写一个能调用Server功能的Client,整个过程都会一步一步讲解。

不知道你有没有遇到过这样的问题:

MCP 就是为了解决这个问题而生的! 它定义了一套标准化的协议,让AI模型可以轻松调用各种外部工具(Tools),就像人类使用USB接口一样方便。

那么,咱们今天的目标就是:

    搭建一个MCP Server(天气查询服务)开发一个MCP Client(调用天气查询的AI助手)让AI模型学会自动调用MCP工具

准备好了吗?咱们开始吧!


1. MCP Server 开发:天气查询服务

1.1 环境准备

首先,咱们得把开发环境搭好,嗯,这一步可不能马虎!

1.2 编写天气查询Server

接下来,咱们要写一个 MCP Server,让它能调用OpenWeatherMap的API查询天气。

从这里openweathermap.org/ 去拿到自己的OpenWeather API Key

核心代码(weather.py

import jsonimport httpxfrom typing import Anyfrom mcp.server.fastmcp import FastMCP# 初始化 MCP 服务器,命名为"WeatherServer"# 嗯,这里相当于创建了一个天气服务的后台程序mcp = FastMCP("WeatherServer")# OpenWeather API 的配置信息# 注意:这个API_KEY是示例,你需要自己去OpenWeather官网申请一个哦!OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather"API_KEY = "xxx"  # 请替换为你自己的 OpenWeather API KeyUSER_AGENT = "weather-app/1.0"  # 这个用来标识我们的应用async def fetch_weather(city: str) -> dict[str, Any] | None:    """    从 OpenWeather API 获取天气信息。    :param city: 城市名称(需使用英文,如 Beijing)    :return: 天气数据字典;若出错返回包含 error 信息的字典    """    # 准备请求参数    params = {        "q": city,          # 城市名        "appid": API_KEY,   # API密钥        "units": "metric",  # 使用公制单位(摄氏度)        "lang": "zh_cn"     # 返回中文描述    }    headers = {"User-Agent": USER_AGENT}  # 设置请求头        # 使用httpx的异步客户端发送请求    async with httpx.AsyncClient() as client:        try:            # 发送GET请求,设置30秒超时            response = await client.get(                OPENWEATHER_API_BASE,                params=params,                headers=headers,                timeout=30.0            )            response.raise_for_status()  # 如果响应不成功会抛出异常            return response.json()  # 返回解析后的JSON数据        except httpx.HTTPStatusError as e:            # 处理HTTP错误(比如404,401等)            return {"error": f"HTTP 错误: {e.response.status_code}"}        except Exception as e:            # 处理其他异常(比如网络问题)            return {"error": f"请求失败: {str(e)}"}def format_weather(data: dict[str, Any] | str) -> str:    """    将天气数据格式化为易读文本。    :param data: 天气数据(可以是字典或 JSON 字符串)    :return: 格式化后的天气信息字符串    """    # 如果传入的是字符串,先尝试转换成字典    if isinstance(data, str):        try:            data = json.loads(data)        except Exception as e:            return f"无法解析天气数据: {e}"        # 如果数据中包含错误信息,直接返回错误提示    if "error" in data:        return f"⚠ {data['error']}"        # 从返回数据中提取天气信息,使用get方法避免KeyError    city = data.get("name", "未知")  # 城市名    country = data.get("sys", {}).get("country", "未知")  # 国家    temp = data.get("main", {}).get("temp", "N/A")  # 温度    humidity = data.get("main", {}).get("humidity", "N/A")  # 湿度    wind_speed = data.get("wind", {}).get("speed", "N/A")  # 风速        # weather字段是个列表,可能为空,所以先给个默认值    weather_list = data.get("weather", [{}])    description = weather_list[0].get("description", "未知")  # 天气描述        # 返回格式化的字符串,用了emoji让输出更直观    return (        f"🌍 {city}, {country}\n"        f"🌡 温度: {temp}°C\n"        f"💧 湿度: {humidity}%\n"        f"🌬 风速: {wind_speed} m/s\n"        f"⛅ 天气: {description}\n"    )@mcp.tool()  # 这个装饰器把这个函数注册为MCP可调用的工具async def query_weather(city: str) -> str:    """    输入指定城市的英文名称,返回今日天气查询结果。    :param city: 城市名称(需使用英文)    :return: 格式化后的天气信息    """    data = await fetch_weather(city)  # 先获取原始天气数据    return format_weather(data)  # 然后格式化输出if __name__ == "__main__":    # 以标准 I/O 方式运行 MCP 服务器    # 这样其他程序就可以通过标准输入输出和这个服务通信啦    mcp.run(transport='stdio')

关键点解析

1.3 在Trae里配置MCP Server

为了让AI能调用这个Server,咱们得在 Trae(一个支持MCP的AI平台)里配置一下:

{  "mcpServers": {    "weather": {      "command": "uv",      "args": ["run", "weather.py"]    }  }}

这样,Trae就知道怎么启动这个天气查询服务啦!


2. MCP Client 开发:让AI学会调用天气查询

2.1 安装依赖

咱们的Client需要调用OpenAI(或者DeepSeek)的模型,所以先装好依赖:

uv add openai python-dotenv

2.2 配置模型参数

.env 文件里写上你的API信息:

BASE_URL=https://api.deepseek.comMODEL=deepseek-chatAPI_KEY=你的API_KEY

这样代码就能安全读取你的密钥,不会泄露啦!

2.3 编写MCP Client

现在,咱们要写一个Client,让它能:

    连接MCP Server让AI模型自动决定什么时候调用天气查询

核心代码(client.py

from openai import OpenAIfrom mcp import ClientSessionclient = OpenAI(api_key="你的API_KEY")async def ask_ai(query):    response = client.chat.completions.create(        model="deepseek-chat",        messages=[{"role": "user", "content": query}],        tools=[{            "type": "function",            "function": {                "name": "query_weather",                "description": "查询指定城市的天气",                "parameters": {"city": {"type": "string"}}            }        }]    )    return response.choices[0].message

当运行Client并询问"今天北京天气怎么样?"时,AI会返回类似这样的格式化天气信息:

🌍 Beijing, CN🌡 温度: 25°C💧 湿度: 65%🌬 风速: 3.2 m/s⛅ 天气: 晴

ai识别当你问“北京天气”,ai自动回发现要去调query_weather工具,然后就自动把北京转成英文Beijing作为参数。

然后就去调用OpenWeather的api去发送请求获取北京天气,收到的数据是:

{  "name": "Beijing",  "sys": {"country": "CN"},  "main": {"temp": 25, "humidity": 65},  "wind": {"speed": 3.2},  "weather": [{"description": "晴"}]}

3. 进阶:让MCP更强大

3.1 更多工具

除了天气查询,咱们还能让AI调用:

只要写好对应的 @mcp.tool(),AI就能学会调用!

3.2 调试技巧

如果AI调工具出错了怎么办?可以用 MCP Inspector 调试:

npx @modelcontextprotocol/inspector uv run weather.py

它会显示AI调用了哪些工具、返回了什么数据,超级方便!


结语

好啦,今天咱们从 MCP ServerMCP Client 完整走了一遍,正好明白:

    MCP Server 提供工具(比如天气查询)MCP Client 让AI学会调用这些工具AI模型 自动决定什么时候该用哪个工具

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MCP AI工具调用 天气查询 Trae OpenAI
相关文章