快速构建MCP工具的开发包FastMCP
FastMCP是一个用于快速构建MCP(Model Context Protocol)服务器的Python框架,它能帮你轻松地将自定义工具和数据源接入大型语言模型(LLM)。你的核心需求是查询天气和热点新闻,这正是FastMCP的典型应用场景。
FastMCP是一个用于快速构建MCP(Model Context Protocol)服务器的Python框架,它能帮你轻松地将自定义工具和数据源接入大型语言模型(LLM)。你的核心需求是查询天气和热点新闻,这正是FastMCP的典型应用场景。
📦 FastMCP核心概念与安装
为了高效开发,了解其核心概念很有帮助。你可以把它看作是为LLM构建“API”的专用框架。
| 核心概念 | 作用 | 简单类比 |
|---|---|---|
| 工具 (Tools) | 让LLM执行具体操作,如查询天气、搜索新闻。 | 可执行的函数 |
| 资源 (Resources) | 向LLM提供只读数据,如配置文件、静态文档。 | 数据文件或只读API |
| 提示 (Prompts) | 为LLM定义可复用的对话模板。 | 预设好的对话脚本 |
安装FastMCP非常简单,推荐使用uv进行高效的依赖管理:
# 安装uv
brew install uv # macOS系统
# 使用uv安装FastMCP
uv pip install fastmcp
🌦️ 实战一:构建天气查询工具
要查询天气,通常需要调用第三方天气API。这里提供一个基于美国国家气象局 (NWS) API 的示例,该API免费且无需注册。
from typing import Any
import httpx
from fastmcp import FastMCP
# 初始化FastMCP服务器
mcp = FastMCP("Weather Server")
# 常量
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
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
"""获取指定经纬度的天气预报。
参数:
latitude: 纬度
longitude: 经度
"""
# 1. 获取该坐标点的预报接口地址
points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
points_data = await make_nws_request(points_url)
if not points_data:
return "无法获取该地点的预报数据。"
# 2. 获取详细的天气预报
forecast_url = points_data["properties"]["forecast"]
forecast_data = await make_nws_request(forecast_url)
if not forecast_data:
return "无法获取详细的预报信息。"
# 3. 格式化返回未来5个时段的预报
periods = forecast_data["properties"]["periods"][:5]
forecasts = []
for period in periods:
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()
⚠️ 注意:此工具基于美国国家气象局(NWS) API,主要覆盖美国地区。如需查询全球天气,可以改用OpenWeatherMap等商业API(通常需要注册并获取API密钥)。
📰 实战二:获取热点新闻
要获取热点新闻,我们可以通过调用聚合新闻的RSS或API来实现。下面是一个示例,它使用了News API(需要注册获取免费API密钥)。
import os
import httpx
from fastmcp import FastMCP
# 初始化FastMCP服务器
mcp = FastMCP("News Server")
NEWS_API_KEY = os.getenv("NEWS_API_KEY") # 请将你的API密钥设置在环境变量中
NEWS_API_BASE = "https://newsapi.org/v2"
@mcp.tool()
async def get_top_headlines(category: str = "general", country: str = "us") -> str:
"""获取指定分类和国家的头条新闻。
参数:
category: 新闻分类,如 business, entertainment, general, health, science, sports, technology
country: 国家代码,如 us, gb, cn
"""
if not NEWS_API_KEY:
return "错误:未配置NEWS_API_KEY环境变量。"
url = f"{NEWS_API_BASE}/top-headlines"
params = {
"apiKey": NEWS_API_KEY,
"category": category,
"country": country,
"pageSize": 10 # 获取10条新闻
}
async with httpx.AsyncClient() as client:
try:
response = await client.get(url, params=params, timeout=30.0)
response.raise_for_status()
data = response.json()
except httpx.RequestError as e:
return f"请求出错: {e}"
except httpx.HTTPStatusError as e:
return f"API返回错误: {e.response.status_code}"
if data["status"] != "ok" or data["totalResults"] == 0:
return "未找到相关新闻。"
articles = data["articles"]
news_list = []
for idx, article in enumerate(articles, 1):
news_list.append(
f"{idx}. {article['title']}\n"
f" 来源: {article['source']['name']}\n"
f" 发布时间: {article.get('publishedAt', 'N/A')}\n"
f" 摘要: {article.get('description', '暂无描述')}\n"
)
return f"找到 {len(articles)} 条新闻:\n\n" + "\n".join(news_list)
if __name__ == "__main__":
# 运行服务器
mcp.run()
🚀 运行、调试与集成
创建好工具后,你需要运行服务器并连接到LLM客户端。
-
运行与调试:
最便捷的方式是使用fastmcp dev命令。这会启动一个带图形界面的MCP Inspector,你可以在其中直接测试刚编写的工具,查看参数和返回结果。fastmcp dev weather_news_server.py -
集成到LLM客户端:
调试无误后,可以将服务器安装到支持MCP的桌面应用(如Claude Desktop)中。fastmcp install weather_news_server.py --name "我的天气新闻工具"安装后,在Claude等助手中,你就可以直接问:“查询纽约的天气”或“给我看看今天的科技新闻”,模型会自动调用对应的工具并返回结果。
为了让你更清晰地了解完整的开发流程,下图总结了从创建工具到集成使用的关键步骤:
flowchart TD
A[定义工具函数] --> B[使用 mcp.tool 装饰器注册]
B --> C[使用 fastmcp dev 调试]
C --> D[使用 fastmcp install 部署到客户端]
D --> E[在LLM客户端中<br>(如Claude)通过对话调用]
总的来说,FastMCP通过其简洁的Python接口,极大地降低了为大语言模型开发外部工具的门槛。除了天气和新闻,你还可以用同样的方式创建计算、文件处理、数据库查询等任何你需要的工具。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)