项目简介

这个项目是 'ai-architecture-charts' 仓库中的一个子模块,专门提供一个Model Context Protocol (MCP) 服务器,用于向AI模型(如LlamaStack代理)暴露外部天气查询工具。它通过与美国国家气象局(NWS)的API交互,获取指定地区的天气预警和预报信息。

主要功能点

  • 天气预警查询: 根据美国州份代码(如CA, NY),获取当前生效的天气预警信息。
  • 地点预报查询: 根据经纬度,获取指定地点的详细天气预报。
  • JSON-RPC通信: 作为MCP服务器,通过JSON-RPC协议(支持SSE传输)与AI客户端进行通信,接收工具调用请求并返回结果。

安装步骤

该MCP服务器通常作为Kubernetes集群中的一个容器化服务部署,其部署由Helm Chart管理。要运行此服务,您需要具备以下条件:

  1. 一个Kubernetes或OpenShift集群(如果通过Helm部署)。
  2. Helm 3.x(如果通过Helm部署)。
  3. Python环境,并安装 'httpx' 和 'mcp-server' 库('pip install httpx mcp-server')。

您可以通过克隆整个'ai-architecture-charts'仓库,然后导航到 'mcp-servers/weather' 目录来找到其Helm Chart定义和源代码。

直接运行Python服务器的步骤

  1. 切换到MCP天气服务的源代码目录:
    cd mcp-servers/weather/src
  2. 安装所需的Python库:
    pip install httpx mcp-server
  3. 运行MCP服务器:
    python weather.py
    这将以Server-Sent Events (SSE) 模式启动MCP服务器,监听在默认端口。

服务器配置

MCP客户端(例如LlamaStack)需要知道如何连接到此MCP服务器并识别其提供的工具。以下是配置MCP客户端以连接到此天气MCP服务器的JSON格式示例:

{
  "server_name": "weather",
  "command": ["python", "weather.py"],
  "args": [],
  "transport": "sse",
  "description": "一个提供天气预警和预报功能的MCP服务器。",
  "tools": [
    {
      "name": "get_alerts",
      "description": "获取某个美国州份的天气预警。",
      "parameters": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string",
            "description": "两字母的美国州份代码 (例如 CA, NY)"
          }
        },
        "required": ["state"]
      }
    },
    {
      "name": "get_forecast",
      "description": "获取某个地点的天气预报。",
      "parameters": {
        "type": "object",
        "properties": {
          "latitude": {
            "type": "string",
            "description": "地点的纬度"
          },
          "longitude": {
            "type": "string",
            "description": "地点的经度"
          }
        },
        "required": ["latitude", "longitude"]
      }
    }
  ]
}

配置参数注释

  • 'server_name': MCP服务器的唯一标识符。
  • 'command': 一个字符串数组,表示启动MCP服务器的可执行文件和其路径。
  • 'args': 一个字符串数组,表示传递给MCP服务器启动命令的额外参数,此处为空。
  • 'transport': MCP服务器使用的传输协议,此处为'sse' (Server-Sent Events)。
  • 'description': 服务器功能的简短描述。
  • 'tools': 一个数组,列出服务器暴露给LLM客户端的工具。每个工具包含:
    • 'name': 工具的名称。
    • 'description': 工具功能的简短描述,帮助LLM理解其用途。
    • 'parameters': 工具所需的输入参数定义,遵循OpenAPI/JSON Schema规范,包含参数类型、描述和是否为必填项。

基本使用方法

MCP服务器一旦运行,AI客户端(如LlamaStack Agent)可以通过JSON-RPC调用其暴露的工具。客户端无需直接编写Python代码来调用 'get_alerts' 或 'get_forecast' 函数,而是通过MCP协议进行抽象调用。

例如,一个AI代理可能会通过内部机制向该MCP服务器发送请求,以回答用户提出的“加州有什么天气预警?”或“北卡罗来纳州罗利的天气预报是什么?”等问题。

以下是一个LlamaStack代理使用此MCP天气工具的Python客户端代码示例:

import os
from uuid import uuid4

from llama_stack_client.lib.agents.agent import Agent
from llama_stack_client.lib.agents.event_logger import EventLogger as AgentEventLogger
from llama_stack_client import LlamaStackClient

# 假设MCP服务器在LlamaStack可以访问的某个URL上注册
# LLAMA_STACK_ENDPOINT 和 LLAMA_STACK_MODEL 需要根据您的LlamaStack部署进行配置
LLAMA_STACK_ENDPOINT = os.getenv("LLAMA_STACK_ENDPOINT", "http://localhost:8080") # 示例URL
LLAMA_STACK_MODEL = os.getenv("LLAMA_STACK_MODEL", "llama3") # 示例模型

client = LlamaStackClient(base_url=LLAMA_STACK_ENDPOINT)

agent = Agent(
    client,
    model=LLAMA_STACK_MODEL,
    instructions="你是一个拥有天气工具的助手",
    enable_session_persistence=False,
    tools=["mcp::weather"] # 注册MCP服务器提供的天气工具,名称与服务器配置中的server_name对应
)

session_id = agent.create_session(f"test-session-{uuid4()}")

response = agent.create_turn(
    messages=[
        {
            "role": "user",
            "content": "告诉我北卡罗来纳州罗利(经度-78.6382,纬度35.7796)的天气预报。",
        }
    ],
    session_id=session_id,
)

print(f"代理响应: {response}")
for log in AgentEventLogger().log(response):
    log.print()

通过上述方式,LlamaStack代理能够自动识别并调用 'mcp::weather' 服务器提供的 'get_forecast' 工具(如果其内部逻辑判断需要),从而获取天气信息并响应用户。

信息

分类

网页与API