天气数据服务

一个基于Open-Meteo API的天气数据服务,提供实时天气和1-16天的天气预报,支持Bearer Token认证和Docker部署。

  • by f18m
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 f18m/test-mcp-server

使用说明

MCP气象服务器

一种模型上下文协议(MCP)服务器,使用带有承载令牌认证的Open-Meteo API提供天气数据。

特性

  • 获取当前天气:获取任何位置的实时天气状况
  • 获取预测:获取1-16天天气预报
  • 承载令牌身份验证:使用基于令牌的身份验证进行安全访问
  • Docker支持:使用Docker和Docker Compose轻松部署

先决条件

  • Python 3.14+(用于本地开发)
  • Docker和Docker Compose(用于容器化部署)
  • MCP承载令牌(用于身份验证)

安装

本地开发

  1. 克隆存储库:
git clone <repository-url>
cd test-mcp-server
  1. 创建Python虚拟环境:
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
  1. 安装依赖项:
pip install -e .
  1. 设置Bearer令牌:
export MCP_BEARER_TOKEN="your-secret-token-here"
  1. 运行服务器:
python main.py

服务器将于启动 http://localhost:8000/mcp

Docker部署

使用Docker

  1. 塑造形象:
docker build -t mcp-weather-server .
  1. 运行容器:
docker run -p 8000:8000 -e MCP_BEARER_TOKEN="your-secret-token" mcp-weather-server

使用Docker Compose(推荐)

创建一个 docker-compose.yml 项目根目录中的文件:

version: '3.8'

services:
  mcp-weather:
    build: .
    container_name: mcp-weather-server
    ports:
      - "8000:8000"
    environment:
      MCP_BEARER_TOKEN: ${MCP_BEARER_TOKEN:-default-secret-token-change-me}
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "-H", "Authorization: Bearer ${MCP_BEARER_TOKEN:-default-secret-token-change-me}", "http://localhost:8000/mcp"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s
  1. 创建一个 .env 使用您的令牌创建文件:
cat > .env << EOF
MCP_BEARER_TOKEN=your-secret-token-here
EOF
  1. 启动服务器:
docker-compose up -d
  1. 查看日志:
docker-compose logs -f mcp-weather
  1. 停止服务器:
docker-compose down

用法

认证

所有请求都需要承载令牌身份验证:

curl -H "Authorization: Bearer your-secret-token" http://localhost:8000/mcp

连接MCP客户端

使用MCP检查器

  1. 设置服务器URL: http://localhost:8000/mcp
  2. 添加授权标头: Bearer your-secret-token

使用Python MCP客户端

from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamable_http_client

headers = {"Authorization": "Bearer your-secret-token"}

async with streamable_http_client("http://localhost:8000/mcp", headers=headers) as (read_stream, write_stream, _):
    async with ClientSession(read_stream, write_stream) as session:
        await session.initialize()
        
        # List available tools
        tools = await session.list_tools()
        for tool in tools.tools:
            print(f"- {tool.name}: {tool.description}")

可用工具

get_current_weather

获取某个位置的当前天气状况。

参数:

  • latitude (浮动):位置的纬度
  • longitude (浮动):位置的经度

例子:

result = await session.call_tool("get_current_weather", latitude=40.7128, longitude=-74.0060)

get_forecast

获取某个地点的天气预报。

参数:

  • latitude (浮动):位置的纬度
  • longitude (浮动):位置的经度
  • days (int):要预测的天数(1-16,默认值:7)

例子:

result = await session.call_tool("get_forecast", latitude=40.7128, longitude=-74.0060, days=5)

测试

在本地运行测试

pip install pytest pytest-asyncio requests
pytest tests/ -v

测试覆盖率

测试套件包括:

  • 服务器启动和初始化
  • 承载令牌身份验证
  • MCP工具清单和验证
  • 与MCP客户端的集成测试

配置

环境变量

变量 描述 默认值
MCP_BEARER_TOKEN 用于身份验证的承载令牌 default-secret-token-change-me

服务器配置

服务器监听:

  • 主机: 0.0.0.0 (所有接口)
  • 端口: 8000
  • 端点: /mcp

Docker编写网络访问

要使服务器可从其他容器或主机访问,请执行以下操作:

从本地主机访问:

docker-compose up
curl -H "Authorization: Bearer your-token" http://localhost:8000/mcp

从其他容器进入:

# In another docker-compose.yml or service
services:
  other-service:
    depends_on:
      - mcp-weather
    environment:
      MCP_SERVER_URL: http://mcp-weather:8000/mcp

从主机访问(在远程服务器上运行时):

curl -H "Authorization: Bearer your-token" http://<server-ip>:8000/mcp

CI/CD

该项目包括GitHub Actions CI管道,该管道:

  • Lints Python代码(黑色、isort、flake8、pylint)
  • 使用mypy进行类型检查
  • 构建Docker镜像并将其推送到ghcr.io
  • 使用pytest运行集成测试

看 .github/workflows/ci.yml 了解详情。

故障排除

服务器无法启动

检查服务器日志:

docker-compose logs -f mcp-weather

身份验证错误

验证Bearer令牌是否设置正确:

echo $MCP_BEARER_TOKEN

在中更新令牌 .env 文件并重新启动:

docker-compose down && docker-compose up -d

连接被拒绝

确保容器正在运行:

docker-compose ps

端口映射是正确的:

docker-compose port mcp-weather 8000

许可证

有关详细信息,请参阅LICENSE文件。

贡献

欢迎投稿!请随时提交拉取请求。