首页 > 其他分享 >借助MCP尝试创建自己的Agent(二)

借助MCP尝试创建自己的Agent(二)

时间:2025-01-23 19:27:34浏览次数:3  
标签:尝试 return 天气 Agent forecast weather now data MCP

借助MCP尝试创建自己的Agent(二)

关于模型上下文协议(model context protocol, MCP)的相关概念可以参考上一篇博客:借助MCP尝试创建自己的Agent(一)

Python SDK构建个性化天气查询服务器

尝试在claude客户端获取天气信息

目前,很多未联网的大模型是不能获取某地当天的天气信息的,例如,当我询问claude桌面版Q: 深圳今天的天气怎么样?却得到了下面的回复?
在这里插入图片描述

如何使本地agent具有天气查询能力呢?MCP文档1给出了详细的实例,我在这里复现一遍。

1. 环境配置

在获取天气信息之前,需要先配置uv环境, uv是一个类似于conda的python包或项目管理工具2

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# MacOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

我用的是windows系统,在PowerShell 安装完成后如图所示。
在这里插入图片描述
安装完成后,重启Powershell,并通过下面的命令创建访问天气的项目。

# windows
# Create a new directory for our project
uv init weather
cd weather
# Create virtual environment and activate it
uv venv
.venv\Scripts\activate
# Install dependencies
uv add mcp[cli] httpx
# Create our server file
new-item weather.py

# MacOS/Linux
# Create a new directory for our project
uv init weather
cd weather
# Create virtual environment and activate it
uv venv
source .venv/bin/activate
# Install dependencies
uv add "mcp[cli]" httpx
# Create our server file
touch weather.py

这里需要在当前目录下创建一个名为weather的文件,如果不想在当前目录下创建,可以先进入到其他目录中再进行操作,我的操作结果如下图所示:
在这里插入图片描述
到这里已经完成了基本环境的配置,下一步可以开始配置服务器了

2. 构建天气服务器

打开之前创建的weather.py文件,导入相应的包,并且设置天气查询服务的MCP服务器设置

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP server
mcp = FastMCP("weather")

# Constants
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

The FastMCP class uses Python type hints and docstrings to automatically generate tool definitions, making it easy to create and maintain MCP tools.

FastMCP 类使用 Python 类型提示和文档字符串自动生成工具定义,使得创建和维护 MCP 工具变得容易。

接着,添加帮助函数,来从国家天气服务(National Weather Service)API查询天气数据

async def make_nws_request(url: str) -> dict[str, Any] | None:
    """Make a request to the NWS API with proper error handling."""
    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:
    """Format an alert feature into a readable string."""
    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()
async def get_alerts(state: str) -> str:
    """Get weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    """
    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:
    """Get weather forecast for a location.

    Args:
        latitude: Latitude of the location
        longitude: Longitude of the location
    """
    # First get the forecast grid endpoint
    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."

    # Get the forecast URL from the points response
    forecast_url = points_data["properties"]["forecast"]
    forecast_data = await make_nws_request(forecast_url)

    if not forecast_data:
        return "Unable to fetch detailed forecast."

    # Format the periods into a readable forecast
    periods = forecast_data["properties"]["periods"]
    forecasts = []
    for period in periods[:5]:  # Only show next 5 periods
        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)

最后,实现运行该服务器,在创建的weather文件夹下通过uv run weather.py运行天气查询服务

if __name__ == "__main__":
    # Initialize and run the server
    mcp.run(transport='stdio')

3. 在Claude桌面版中配置天气查询服务器

找到并打开claude_desktop_config.json文件,将添加的weather服务加入到mcpServers

{
    "mcpServers": {
        "weather": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\ABSOLUTE\\PATH\\TO\\PARENT\\FOLDER\\weather",
                "run",
                "weather.py"
            ]
        }
    }
}

重启claude 客户端

!!! 然而,重启之后出现了问题,发现配置失败。原因是访问位置不在美国,导致了天气访问的API出现了问题。挂美国的梯子也不行,所以对weather.py的代码进行改进
在这里插入图片描述

4. 改进weather服务器代码

第二天我重新按官方文档设置了一遍,目前可以查看美国各州的天气警告信息,但访问其他地方的天气时还会出现问题,估计是API的原因
在这里插入图片描述
这里的改进用了和风天气的API3,想尝试的小伙伴可以看一看,可以免费使用1000个token。根据和风天气返回数据的特点,删除了预测和警告信息查看功能,只保留了查询目前天气情况的功能,该变代码如下:

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP
import asyncio
# Initialize FastMCP server
mcp = FastMCP("weather")
# Constants
NWS_API_BASE = "https://devapi.qweather.com/v7/weather"
USER_AGENT = "weather-app/1.0"
key = "xxxx" # 输入你自己的key
async def make_nws_request(url: str) -> dict[str, Any] | None:
    """
        访问网站
    """
    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_now(latitude: float, longitude: float) -> str:
    """Get weather forecast for a location.

    Args:
        latitude: Latitude of the location
        longitude: Longitude of the location
    """
    # First get the forecast grid endpoint
    points_url =  f"{NWS_API_BASE}/now?location={longitude},{latitude}&key={key}"
    points_data = await make_nws_request(points_url)

    if not points_data:
        return "Unable to fetch detailed forecast"
    now = points_data['now']
    weather_info = (
        f"观测时间: {now['obsTime']}\n"
        f"温度: {now['temp']}°C\n"
        f"体感温度: {now['feelsLike']}°C\n"
        f"天气: {now['text']}\n"
        f"风向: {now['windDir']}\n"
        f"风力等级: {now['windScale']}\n"
        f"风速: {now['windSpeed']}km/h\n"
        f"湿度: {now['humidity']}%\n"
        f"降水量: {now['precip']}mm\n"
        f"气压: {now['pressure']}hPa\n"
        f"能见度: {now['vis']}km"
    )
    return weather_info
if __name__ == "__main__":
    # Initialize and run the server
    mcp.run(transport='stdio')
    # weather_data = asyncio.run(get_now(22.5,114))
    # if weather_data:
    #     print(weather_data)

最后,成功通过claude获取了某个城市天气信息,这里不仅仅是添加了天气服务,而且窥探了通过python自定义服务的功能,这里需要仔细阅读官方给出了Python SDK网页内容,才能实现自己后续的开发。
在这里插入图片描述


今天的分享就到这里,欢迎各位大佬批评指正。我是会编程的加缪,目前正在学习LLMs相关知识,有问题欢迎与我讨论!


  1. MPC document ↩︎

  2. An extremely fast Python package and project manager, written in Rust. ↩︎

  3. 和风天气开发服务 ↩︎

标签:尝试,return,天气,Agent,forecast,weather,now,data,MCP
From: https://blog.csdn.net/m0_47211450/article/details/145292566

相关文章

  • 尝试本地部署|DeepSeek
    微博上看到DeepSeek的报告,尝试想本地部署百度,bing后,深感英文太差,找个翻译帮助;1、找到网址  how-to-run-locally https://github.com/deepseek-ai/DeepSeek-V3?tab=readme-ov-file#6-how-to-run-locally 2、按步骤Clone gitclonehttps://github.com/deepseek-ai/Deep......
  • copy Electron 离线环境打包解决方案(electron-forge) 未尝试
     1.在线环境准备创建新项目:#创建并进入项目目录mkdirmy-electron-app&&cdmy-electron-app#初始化项目npminit-y#安装electronnpminstall--save-develectron#安装electron-forgenpminstall--save-dev@electron-forge/cli@electron-forge/maker......
  • 迅为RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • 几乎是跪着看完AI教母李飞飞的开年巨作!-《AI Agent:多模态交互前沿调查》
    多模态AI系统很可能会在我们的日常生活中无处不在。将这些系统具身化为物理和虚拟环境中的代理是一种有前途的方式,以使其更加互动化。目前,这些系统利用现有的基础模型作为构建具身代理的基本构件。将代理嵌入这样的环境中,有助于模型处理和解释视觉和上下文数据的能力,这是创......
  • CogAgent: A Visual Language Model for GUI Agents
    CogAgent:利用VLM操作GUI。主要内容提出了一个18B的VLM模型CogAgent(CogVLM的新版本),旨在提高对于GUI的理解、导航和交互能力。利用高分辨率和低分辨率编码器适应不同分辨率的输入,在9个VQAbenchmarks上取得了sota。同时,CogAgent利用截屏输入,在PC和安卓GUI导航任务上比其他基于......
  • AI agent 在 6G 网络应用,无人机群控场景
    AIagent在6G网络应用,无人机群控场景随着6G时代的临近,融合人工智能成为关键趋势。借鉴IT行业AIAgent应用范式,提出6GAIAgent技术框架,包含多模型融合、定制化Agent和插件式环境交互理念,构建了涵盖四层结构的框架。通过各层协同实现自主环境感知等能力,并以无......
  • 大模型agent开发之toolkits使用
    Toolkits用途toolkit提供了预定义工具集合,专注于某些特定服务,比如数据库查询、文件处理、Python代码执行、网络爬虫等任务。这些工具集为Agent提供了更高层次的抽象,简化了工具的使用过程。常见的ToolkitSQLDatabaseToolkit:使用场景主要是要通过自然语言对数据库执行查询,可......
  • 2025年值得研究的AI Agent五大框架
    什么是AIAgent?AIAgent的定义多种多样,常见的翻译为“智能体”,但直译为“代理”。随着大语言模型(LLM)的发展,AI的能力已不再局限于简单的任务自动化,而是能够处理复杂且连续的工作流。例如,基于LLM的助手可以自动替用户在电商平台上订购商品并安排配送。这类助手被称为AIAgent......
  • 使用 Python 开发一个 AI Agent 自媒体助手示例
    1.项目背景随着自媒体行业的快速发展,内容创作者需要处理大量重复性任务,例如撰写文章、生成标题、优化关键词、分析数据等。通过开发一个AIAgent自媒体助手,可以帮助创作者高效完成这些任务,节省时间并提升内容质量。本文将展示如何使用Python构建一个简单的AIAgent......
  • Agent系列(一)——利用OpenAI快速搭建简易Agent
    目录1、Agent 简介1.1Agents的核心组件1.1.1模型(Model):1.1.2工具(Tools):1.1.3编排层(OrchestrationLayer):1.2Agents的运作机制:从输入到输出 2、搭建简易的Agent 2.1模型准备2.1.1获取 api_key2.1.2获取base_url和chat_model2.2搭建Agent2.2.......