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客户端。

  1. 运行与调试
    最便捷的方式是使用 fastmcp dev 命令。这会启动一个带图形界面的MCP Inspector,你可以在其中直接测试刚编写的工具,查看参数和返回结果。

    fastmcp dev weather_news_server.py
    
  2. 集成到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接口,极大地降低了为大语言模型开发外部工具的门槛。除了天气和新闻,你还可以用同样的方式创建计算、文件处理、数据库查询等任何你需要的工具

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐