#!/usr/bin/env python3
"""
MCP Сервер для получения погоды через OpenWeatherMap API
Запускает MCP сервер с инструментами для получения текущей погоды и прогноза.
"""
import logging
import sys
import traceback
from mcp.server.fastmcp import FastMCP
from modules.config import Config
from modules.weather_api import get_current_weather, get_forecast
# Валидируем конфигурацию перед запуском
if not Config.validate():
sys.exit(1)
logger = logging.getLogger("WeatherServer")
# Создаем экземпляр MCP сервера с именем "weather"
mcp = FastMCP("weather")
logger.info(Config.get_config_summary())
@mcp.tool()
async def current_weather(city: str, units: str = "metric") -> str:
"""
Инструмент MCP для получения текущей погоды.
Получить текущую погоду для указанного города.
Args:
city: Название города на русском или английском (например, "Москва" или "Moscow")
units: Система измерения - "metric" (Цельсий) или "imperial" (Фаренгейт)
Returns:
Строка с описанием текущей погоды или сообщение об ошибке.
"""
return await get_current_weather(city, units)
@mcp.tool()
async def weather_forecast(city: str, days: int = 3, units: str = "metric") -> str:
"""
Инструмент MCP для получения прогноза погоды.
Получить прогноз погоды на несколько дней.
Args:
city: Название города на русском или английском
days: Количество дней для прогноза (автоматически ограничивается от 1 до 5)
units: Система измерения - "metric" (Цельсий) или "imperial" (Фаренгейт)
Returns:
Строка с прогнозом погоды или сообщение об ошибке.
"""
return await get_forecast(city, days, units)
# Запуск сервера
if __name__ == "__main__":
logger.info("Запуск MCP сервера погоды...")
try:
mcp.run(transport="stdio")
except Exception as e:
logger.critical(f"Критическая ошибка при запуске MCP сервера: {e}\n{traceback.format_exc()}")
sys.exit(1)