背景介绍
前面我们介绍了MCP的基本概念,了解到了MCP的基本组成架构是:MCP Host、MCP Client和MCP Server。那么今天就来实践地写一个天气查询的MCP Server
在一些网页版的AI询问当前地方的天气时,通常时得不到正确的天气信息大的,因为假如不联网搜索的话,AI 大模型所回答的内容一般就是根据训练的数据得出的,例如下图就是询问千问当前最新的模型,回答我的内容并非我所在地方的当前天气情况。
那假如我想查询我所在地当前的天气状况呢?可以通过哪些方法实现呢?或者当我想做一个智能家居出行助手的智能体,这个智能体是怎么获取当前天气状况来决定告诉我们今天适合什么样的穿搭或者今天出门是不是要带上伞之类的,那么话不多说,就开始今天的MCP Server实践吧!
第一步:在电脑上创建环境
电脑上的环境是至关重要的,由于我们这次实践使用到的语言是python,所以需要导入一些所需要的包,传统的安装python包的方式是pip install + 包名,也是现在主流的方法。但是现在出现了一种新方法uv,与传统方法相比,速度更快并且还提供了完整的虚拟环境管理功能。uv通过pyproject.toml提供了更现代化的依赖管理方案,更好的处理复杂的依赖关系。
那么先安装uv吧
pip install uv
假如电脑上没有pip,也可以使用下面这个命令安装uv:
powershell -Executionpolicy ByPass -c "irm https://astral.sh/uv/install.psl |iex"
安装成功之后我们来学习uv的几个基本命令,后续的项目中也会使用到这些命令
(1)使用uv安装python包时:
uv pip install requests
(2)对创建的虚拟环境管理
uv venv myenv
(3)创建环境之后,激活环境的命令:
myenv\scripts\activate
下面就进入配置环境的正题:构建一个查询天气的MCP Server,首先需要导入mcp包,考虑到需要调用别的资源,所以也要导入一个httpx包,httpx
是 Python 中一个现代、全功能且高性能的 HTTP 客户端库,旨在替代传统的 requests
库,同时支持同步和异步请求。
第二步:MCP Server的代码
首先需要导入所需要的python包
import json # 用于处理json数据
import httpx # 用于发送HTTP请求
from typing import Any # 用于类型注解
from mcp.server.fastmcp import FastMCP # 用于处理FastMCP相关操作
mcp = FastMCP("WeatherServer") # 创建天气查询服务实例
查询当前的天气需要调用外部工具,我们选择进入OpenWeather网站查询天气,并且配置API
# OpenWeatherMap API配置
OPENWEATHER_API = "https://api.openweathermap.org/data/2.5/weather" # OpenWeatherMap API endpoint
OPENWEATHER_API_KEY = "" # 替换为你的OpenWeatherMap API密钥
USER_AGENT = "weather-app/1.0"
接下来就到了重头戏的部分,写查询天气的函数
# 天气查询函数
async def get_weather(city: str) -> dict[str, Any]:#定义异步获取天气信息的函数
"""
从OpenWeatherMap API获取指定城市的天气信息。
:param city: 城市名称
:return: 包含天气信息的字典
"""#这些注解一定要写,帮助大模型理解函数的作用和参数类型
http请求头的设置
# http请求参数设置
params = {
"q": city, # 城市名称
"appid": OPENWEATHER_API_KEY, # API密钥
"units": "metric", # 使用公制单位
"lang": "zh_cn" # 使用中文语言
}
# http请求头设置
headers = {
"User-Agent": USER_AGENT, # 设置用户代理
}
使用MCP工具函数:
# 使用mcp的装饰器将其标记为一个工具
@mcp.tool("weather", "查询天气信息")
async def weather_tool(city: str) -> str:
"""
查询指定城市的天气信息。
:param city: 城市名称
:return: 格式化后的天气信息字符串
"""
# 调用get_weather函数获取天气数据
weather_data = await get_weather(city)
# 调用format_weather函数格式化天气数据
return format_weather(weather_data)
# 程序入口
if __name__ == "__main__":
mcp.run(transport="stdio")
到这里基本的代码就写完了,个人觉得最重要的代码是使用MCP工具函数,因为这是MCP Server的格式,前面的算是实现查询天气功能的函数。
第三步:部署
如何部署一个MCP Server呢?这里我使用的是Cherry Studio。首先进入设置,然后选中MCP服务器,添加MCP服务器,如果你的右上角出现了红色的三角感叹号是提示你要装一下Bun和UV,因为Cherry Studio需要内置这些,不能使用本机系统中的,安装好之后会显示绿色的勾。
下面的参数设置如下:
--directory
D:\MCP\MCP_Minimalist_Development\example
run
main.py
其中--directory是不可省略的,第二行是代码所在的路径,run命令,第四行就是代码的名字。
点击保存和启动MCP服务之后来到首页,选择助手
就可以使用我们创建的查询天气的MCP Server了。
项目中我还没有填写API信息,所以目前还是测试数值,大家感兴趣可以自行尝试一下,也可以找我索要源代码,评论或者私信都可以。本人也是小白,一起加油!