之前很早就听说mcp了,但是一直没尝试下,今天试了下官方示例感觉还不错的样子。
官方的示例是一个调用天气接口获取天气预警和预报的服务
python
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP
# 初始化 FastMCP server
mcp = FastMCP("weather")
# 定义天气查询工具
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"
async def make_nws_request(url:str)->dict[str,Any] | None:
"""使用NWS API进行天气查询"""
headers = {
"User-Agent": USER_AGENT,
"Accept": "application/geo+json",
}
async with httpx.AsyncClient() as client:
try:
response = await client.get(url, headers=headers, timeout=30.0)
response.raise_for_status()
return response.json()
except Exception:
return None
def format_alert(feature: dict)-> str:
"""格式化天气预警"""
props = feature.get("properties", {})
if not props:
return "无预警信息"
alert = feature.get("properties", {})
title = alert.get("title", "无标题")
description = alert.get("description", "无描述")
area_desc = alert.get("areaDesc", "未知区域")
return f"标题: {title}\n描述: {description}\n区域: {area_desc}"
@mcp.tool()
async def get_alerts(state:str)-> str:
"""获取天气预警"""
url = f"{NWS_API_BASE}/alerts/active?area={state}"
data = await make_nws_request(url)
if not data or "features" not in data:
return "无法获取天气预警信息"
if not data['features']:
return "没有天气预警信息"
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:
"""获取天气预报"""
points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
points_data = await make_nws_request(points_url)
if not points_data:
return "无法获取此位置的天气预报信息"
forecast_url = points_data['properties']['forecast']
forecast_data = await make_nws_request(forecast_url)
if not forecast_data:
return '无法获取天气预报信息'
periods = forecast_data['properties']['periods']
forecasts = []
for period in periods[:5]:
forecast = f"""
{period['name']}:
温度: {period['temperature']}°{period['temperatureUnit']}
风速: {period['windSpeed']} {period['windDirection']}
预测: {period['detailedForecast']}
"""
forecasts.append(forecast)
return "\n---\n".join(forecasts)
if __name__ == '__main__':
mcp.run(transport="stdio")
代码很简单,有两个mcp服务get_alerts
是获取天气预警的,get_forecast
是获取天气预报的
写完这些代码后,还需要配置Claude的配置文件,主要是配置程序运行路径
json
{
"mcpServers": {
"weather": {
"command": "uv",
"args": [
"--directory",
"C:\\Users\\jesse\\Documents\\workspace\\mcp\\weather",
"run",
"weather.py"
]
}
}
}
重新启动后,会有两个mcp服务

这是mcp的使用效果

参考资料