项目简介
这个项目是 'ai-architecture-charts' 仓库中的一个子模块,专门提供一个Model Context Protocol (MCP) 服务器,用于向AI模型(如LlamaStack代理)暴露外部天气查询工具。它通过与美国国家气象局(NWS)的API交互,获取指定地区的天气预警和预报信息。
主要功能点
- 天气预警查询: 根据美国州份代码(如CA, NY),获取当前生效的天气预警信息。
- 地点预报查询: 根据经纬度,获取指定地点的详细天气预报。
- JSON-RPC通信: 作为MCP服务器,通过JSON-RPC协议(支持SSE传输)与AI客户端进行通信,接收工具调用请求并返回结果。
安装步骤
该MCP服务器通常作为Kubernetes集群中的一个容器化服务部署,其部署由Helm Chart管理。要运行此服务,您需要具备以下条件:
- 一个Kubernetes或OpenShift集群(如果通过Helm部署)。
- Helm 3.x(如果通过Helm部署)。
- Python环境,并安装 'httpx' 和 'mcp-server' 库('pip install httpx mcp-server')。
您可以通过克隆整个'ai-architecture-charts'仓库,然后导航到 'mcp-servers/weather' 目录来找到其Helm Chart定义和源代码。
直接运行Python服务器的步骤:
- 切换到MCP天气服务的源代码目录:
cd mcp-servers/weather/src - 安装所需的Python库:
pip install httpx mcp-server - 运行MCP服务器:
这将以Server-Sent Events (SSE) 模式启动MCP服务器,监听在默认端口。python weather.py
服务器配置
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