动手写一个简单的MCP(Model Context Protocol)
准备工作
安装vscode,以及在vscode中安装扩展cline,并准备uv工具
其中uv是一个极速的 Python 包管理器和项目管理工具,安装参考官方github仓库。
windows使用终端命令即可
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
使用uv --version查看是否成功

然后随便选择一个工作目录,创建项目文件夹
uv init weather
cd weather
创建虚拟环境并安装依赖
uv venv
#然后按照终端的提示,激活虚拟环境
.\.venv\Scripts\Activate.ps1
#如出现(weather)则说明激活成功
uv add "mcp[cli]" httpx
#安装依赖

好处是weather项目文件夹有自己独立的虚拟环境,删除这个文件夹,虚拟环境也会被删除
创建脚本文件
使用vscode打开这个项目

创建脚本文件weather.py,代码如下
# 导入类型注解支持
from typing import Any
# 导入 httpx 用于异步 HTTP 请求
import httpx
# 导入 FastMCP 用于快速构建 MCP 服务器
from mcp.server.fastmcp import FastMCP
# 初始化 FastMCP 服务器,命名为 "weather",日志级别设为 ERROR
mcp = FastMCP("weather", log_level="ERROR")
# 常量定义:NWS(美国国家气象服务)API 基础 URL
NWS_API_BASE = "https://api.weather.gov"
# 用户代理标识,NWS API 要求请求必须包含 User-Agent
USER_AGENT = "weather-app/1.0"
#async def: 定义“协程函数”的关键字。url: str表示参数 url 应该是字符串类型。-> dict[str, Any] | None: 这是对返回值的类型注解。
async def make_nws_request(url: str) -> dict[str, Any] | None:
"""向 NWS API 发送异步请求,并进行错误处理
Args:
url: 请求的 API 地址
Returns:
成功时返回解析后的 JSON 数据字典,失败时返回 None
"""
# 设置请求头,包含 User-Agent 和接受的响应格式
headers = {
"User-Agent": USER_AGENT,
"Accept": "application/geo+json"
}
# 使用异步 HTTP 客户端发送请求
async with httpx.AsyncClient() as client:
try:
response = await client.get(url, headers=headers, timeout=30.0)
# 如果状态码不是 2xx,抛出异常
response.raise_for_status()
return response.json()
except Exception:
# 发生任何异常时返回 None
return None
def format_alert(feature: dict) -> str:
"""将天气警报特征格式化为可读字符串
Args:
feature: 包含警报信息的字典
Returns:
格式化后的警报字符串
"""
# 提取警报的属性部分
props = feature["properties"]
return f"""
Event: {props.get('event', 'Unknown')} # 事件类型
Area: {props.get('areaDesc', 'Unknown')} # 受影响区域
Severity: {props.get('severity', 'Unknown')} # 严重程度
Description: {props.get('description', 'No description available')} # 描述
Instructions: {props.get('instruction', 'No specific instructions provided')} # 应对建议
"""
#@mcp.tool()是装饰器,告诉 MCP 服务器:这个函数是一个工具,AI模型可以调用它,工具说明书也会发给AI模型
@mcp.tool()
async def get_alerts(state: str) -> str:
"""获取美国某个州的天气警报
Args:
state: 美国州的两字母代码(如 CA、NY)
Returns:
该州的活跃天气警报信息,格式化为字符串
"""
# 构建获取特定州活跃警报的 API URL
url = f"{NWS_API_BASE}/alerts/active/area/{state}"
# 发送异步请求获取数据
data = await make_nws_request(url)
# 检查数据是否有效
if not data or "features" not in data:
return "Unable to fetch alerts or no alerts found."
# 如果没有活跃警报
if not data["features"]:
return "No active alerts for this state."
# 格式化所有警报并用分隔符连接
alerts = [format_alert(feature) for feature in data["features"]]
return "\n---\n".join(alerts)
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
"""获取指定位置的天气预报
Args:
latitude: 纬度
longitude: 经度
Returns:
该位置的天气预报信息,格式化为字符串
"""
# 第一步:获取该坐标对应的预报网格端点
points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
points_data = await make_nws_request(points_url)
if not points_data:
return "Unable to fetch forecast data for this location."
# 第二步:从网格响应中提取实际预报 URL,并获取预报数据
forecast_url = points_data["properties"]["forecast"]
forecast_data = await make_nws_request(forecast_url)
if not forecast_data:
return "Unable to fetch detailed forecast."
# 格式化各个时段的预报信息
periods = forecast_data["properties"]["periods"]
forecasts = []
# 只显示前 5 个时段的预报
for period in periods[:5]:
forecast = f"""
{period['name']}:
Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""
forecasts.append(forecast)
return "\n---\n".join(forecasts)
#如果这个文件是被 import 导入到其他文件中,下面这段代码不会执行。
if __name__ == "__main__":
# 程序入口:启动 MCP 服务器,使用标准输入输出进行通信
mcp.run(transport='stdio')
#transport='stdio'通过管道与客户端进行文本数据交换。
准备 MCP 服务器配置的 JSON 文件

在Cline窗口中按下这里的configure Mcp Servers,会自动创建cline_mcp_settings.json文件
注意项目地址需要修改成你当前使用的目录
{
"mcpServers": {
"weather":{
"disabled":false,
"timeout":60,
"command":"uv",
"args":[
"--directory",
"C:\\Users\\Temp\\Desktop\\t\\weather",
"run",
"weather.py"
],
"transportType":"stdio"
}
}
}
这是一个 __MCP (Model Context Protocol) 服务器配置文件__,用于定义如何运行一个名为 "weather" 的 MCP 服务器。
## 详细说明:
__mcpServers__: MCP 服务器的根配置对象
__weather__: 服务器的名称(标识符)
- __disabled: false__: 服务器已启用,可以正常使用
- __timeout: 60__: 超时时间为 60 秒,如果服务器响应超过这个时间会被视为超时
- __command: "uv"__: 使用 `uv` 命令来启动服务器(`uv` 是 Python 包管理器和运行工具)
- __args__: 启动参数数组
- `"--directory"`, `"C:\\Users\\Temp\\Desktop\\t\\weather"`: 指定工作目录
- `"run"`, `"weather.py"`: 运行 weather.py 脚本- __transportType: "stdio"__: 使用标准输入/输出 (stdin/stdout) 作为通信方式
## 作用:
这个配置让 AI 助手(如 Cline)能够与 `weather.py` 这个 Python 脚本通信,通过 MCP 协议调用其中定义的工具。例如:
- 获取天气预报 (`get_forecast`)
- 获取天气警报 (`get_alerts`)通过这种方式,MCP 服务器将 Python 脚本的功能暴露给 AI 助手,使 AI 能够执行特定的任务(如查询天气)。
cline运行结果

AI agent配置weather MCP---以Claude code为例
要让它可用,需要在 Claude Code 的配置文件中注册。
你使用的是 FastMCP,这是目前推荐的 MCP 开发方式。配置方法:
1. 找到配置文件位置(Windows):
%APPDATA%\Claude\.claude.json
#可能不同的人安装位置不一样
2. 添加 MCP 服务器配置:
#找到配置文件之后,发给claude code这一步可以让claude code帮你完成

3.重启claude code(连续按下两次Ctrl + C 再启动即可)
claude -c恢复最近的会话
claude --resume 选择要恢复的对话
或者启动后 输入/resume切换历史会话
效果如下


更多推荐



所有评论(0)