天气数据获取工具

一个基于FastMCP的MCP服务器,提供美国国家气象局(NWS)的天气警报和7天天气预报数据获取功能,主要用于API Dash项目的MCP测试验证。

  • by Gaurav5189
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Gaurav5189/mcp-weather-poc

使用说明

mcp天气poc

一个概念证明MCP(模型上下文协议)服务器 FastMCP, 作为我的GSoC提案的一部分创建 API Dash-创意#1:MCP测试.

这不仅仅是一个hello world服务器——它记录了真正的bug点击、应用的修复、, 以及失败的MCP客户端集成,这直接推动了为什么API Dash 需要建立测试基础设施。


这表明了什么

  • MCP服务器内置 FastMCP (官方Python SDK)
  • 两个工具通过自动注册 @mcp.tool() 装饰器
  • 从Python类型提示+文档字符串自动生成JSON模式
  • 正确的STDIO传输 stderr-仅日志记录(无stdout污染)
  • 在不使用LLM的情况下发现并修复了HTTP级别的错误
  • 通过MCP Inspector v0.15.0和OpenAI Codex CLI进行测试

工具

工具 说明
get_alerts 获取美国某州的NWS天气警报
get_forecast 获取美国纬度/经度坐标的7天预测

如何跑步

先决条件: Python 3.10+, 紫外线,Node.js 20+

git clone https://github.com/Gaurav5189/mcp-weather-poc
cd mcp-weather-poc
uv add "mcp[cli]" httpx
uv run mcp dev weather.py
# Opens MCP Inspector at http://localhost:5173

截图


Bug命中与修复(真正的学习)

Bug 1-- httpx 默认情况下不遵循重定向

NWS API返回 301 Moved Permanently 转换为四舍五入的坐标URL (例如。 20.593683 → 20.5937). httpx 默认情况下将其视为终端错误, 不像 requests.修复:一个参数-- follow_redirects=True.

# Before
r = await client.get(url, headers=headers, timeout=10.0)

# After
r = await client.get(url, headers=headers, timeout=10.0, follow_redirects=True)

Bug 2——非美国坐标返回了原始Python回溯

NWS API仅适用于美国。传递覆盖区域外的坐标会导致未处理的 直接向调用者显示的异常——一种破碎的开发人员体验。 修复了显式边界框复选框返回干净、可操作的错误消息的问题。

longitude_ok = -125.0 <= longitude <= -66.0
latitude_ok = 24.0 <= latitude <= 50.0
if not (latitude_ok and longitude_ok):
    return (
        f"Error: Coordinates ({latitude}, {longitude}) are outside the contiguous United States (lower 48). "
        "This PoC uses a simple bounding box check; the NWS API is US-covered, but not all US regions "
        "(e.g. Alaska/Hawaii) fall within these bounds. "
        "Try New York (40.7128, -74.0060) or Los Angeles (34.0522, -118.2437)."
    )

观察结果——stderr日志在检查器中显示为“红色错误”

MCP检查器将所有stderr输出标记为“错误输出”,而不管日志级别如何。 这些日志是 INFO: 水平,完全正确。这就是 STDIO陷阱: stdout 为JSON-RPC流保留。一个 print() 通话腐败 协议并导致客户端连接崩溃。始终登录到 sys.stderr.


Codex实验-为什么需要API Dash的MCP测试仪

在验证了Inspector中的服务器是否正常工作后,我尝试将其连接到 OpenAI Codex命令行界面 作为现实世界的MCP客户端测试。

正确配置后 ~/.codex/config.toml:

[mcp_servers.weather-poc]
command = "uv"
args = ["run", "--with", "mcp", "mcp", "run", "/path/to/weather.py"]

Codex仍然没有将MCP工具作为一级函数调用来调用。相反, 它读到 weather.py 源代码,并使用复制NWS API调用本身 curl 和 node该模型甚至承认了这一点:

“此聊天界面不会将自定义MCP工具作为一流工具公开 可调用工具,所以我通过当地气象MCP项目获取了它 NWS支持本次会议的实时通话。"

这是API Dash MCP测试功能解决的核心问题。

现有的AI CLIs对MCP工具调用的处理不一致。开发商大楼 如今,MCP服务器没有可靠、确定的方法来验证其工具是否 正确调用-无需燃烧LLM API信用,无需猜测是否 客户端默默地后退,没有通读模糊的模型输出 推断实际发生了什么。

此PoC中的每个错误都是使用 MCP检查器的手动JSON有效载荷 测试员 --不涉及LLM,没有歧义,直接结构化输入→ 结构化的 输出。这正是API Dash提案第三阶段给开发者带来的 用于他们自己的MCP服务器。


GSoC提案架构

此PoC映射到 阶段4 API Dash MCP测试功能的建议:

阶段 建造什么
第一阶段 Node.js协议适配器使用 @modelcontextprotocol/sdk,通过以下方式生成MCP服务器进程 child_process,管理JSON-RPC stdio连接
第2阶段 API Dash中的React仪表板用于服务器配置,通过 tools/list 和 resources/list,呈现实时工具模式
第三期 手动JSON有效负载测试引擎——手动构造工具调用,捕获响应和错误堆栈跟踪,在没有LLM的情况下进行调试
阶段4 作为API Dash自己的CI/CD管道的自动化测试目标的伪Python MCP服务器(如此服务器)

堆栈:Python 3.13·uv·FastMCP 1.26.0·httpx·MCP Inspector v0.15.0·OpenAI Codex CLI·Parrot OS