Skip to main content
Glama
ASXRND

MCP Weather & Accruals Server

by ASXRND

🌤️ MCP Сервер Погоды с Deepseek

Простой MCP сервер для получения погоды через OpenWeatherMap API с использованием Deepseek API в качестве интерфейса и поддержкой модульной архитектуры.

📋 Что это делает?

  • 🌍 Получает текущую погоду для любого города через OpenWeatherMap API

  • 📅 Показывает прогноз погоды на несколько дней

  • 🤖 Использует Deepseek для естественного общения и вызова инструментов с реальными данными

  • 📦 Интегрирован с удалённой PostgreSQL базой и FastAPI для работы с данными о начислениях

  • 🔧 Реализует протокол MCP для подключения AI к внешним данным

  • 🏗️ Модульная архитектура с асинхронными операциями

📁 Структура проекта

OpenWeatherMap_MCP/ ├── modules/ # Пакет модулей приложения │ ├── __init__.py # Инициализация пакета модулей │ ├── config.py # Конфигурация (загрузка переменных окружения) │ ├── weather_api.py # Функции для работы с OpenWeatherMap API │ ├── deepseek_api.py # Функции для работы с Deepseek API │ └── file_api.py # Функции для файловых операций ├── fastapi_udalennii/ # Удалённый FastAPI проект (на другом хосте) │ ├── app/ │ │ ├── main.py # FastAPI приложение с endpoints │ │ ├── models.py # SQLAlchemy таблицы (users, accruals) │ │ ├── schemas.py # Pydantic схемы для валидации │ │ ├── crud.py # CRUD операции для БД │ │ ├── db.py # Подключение к БД │ │ └── config.py # Конфигурация │ ├── alembic/ # Миграции БД │ │ └── versions/ │ │ ├── 0001_create_users_table.py │ │ └── 0002_create_accruals_table.py │ ├── requirements.txt # Зависимости FastAPI │ ├── .env # Конфиг БД для удалённого сервера │ └── README.md # Инструкции для удалённого FastAPI ├── deepseek_client.py # Клиент для интерактивного чата с Deepseek ├── server.py # MCP сервер с инструментами погоды ├── test_project.py # Тесты ├── .env # API ключи (не добавляйте в Git!) ├── requirements.txt # Python зависимости для локального клиента ├── DEPLOYMENT_INSTRUCTIONS.md # Инструкции по развёртыванию FastAPI └── README.md # Эта инструкция

🚀 Быстрый старт

1. Установка зависимостей

# Создайте виртуальное окружение python3 -m venv venv # Активируйте его # На macOS/Linux: source venv/bin/activate # На Windows: venv\Scripts\activate # Установите зависимости pip3 install -r requirements.txt

2. Настройка API ключей и подключений

Создайте файл .env в корне проекта:

# ===== OpenWeatherMap ===== OPENWEATHER_API_KEY=ваш_ключ_здесь OPENWEATHER_BASE_URL=https://api.openweathermap.org/data/2.5 # ===== Deepseek ===== DEEPSEEK_API_KEY=ваш_ключ_здесь # ===== Database (PostgreSQL) ===== DATABASE_URL=postgresql://username:password@192.168.0.134:5432/mydb # ===== Accruals API (Remote FastAPI) ===== ACCRUALS_API_URL=http://192.168.0.137:8000 # ===== File Operations ===== ALLOWED_BASE_DIR=/path/to/allowed/dir # ===== Logging ===== LOG_LEVEL=INFO

Получение API ключей:

  • OpenWeatherMap:

    1. Зарегистрируйтесь на https://openweathermap.org

    2. Перейдите в раздел API Keys

    3. Скопируйте ключ (бесплатный план: 1000 запросов/день)

  • Deepseek:

    1. Зарегистрируйтесь на https://platform.deepseek.com

    2. Создайте новый API ключ

    3. Пополните баланс (бесплатный кредит ~$5)

3. Запуск Deepseek клиента

python3 deepseek_client.py

4. (Опционально) Работа через удалённый API для начислений

Deepseek может запрашивать данные о начислениях через REST API (FastAPI) — если у вас уже развернут удалённый API, укажите его базовый URL в переменной ACCRUALS_API_URL.

ACCRUALS_API_URL=http://192.168.0.137:8000

Убедитесь, что удалённая база и API содержат необходимые данные — локальные утилиты для загрузки Excel (modules/db_loader.py) удалены из репозитория. После настройки ACCRUALS_API_URL Deepseek сможет запрашивать статистику и списки начислений у удалённого сервера.

Теперь в клиенте Deepseek можно спрашивать о начислениях (см. примеры ниже).

💬 Примеры использования

Работа с погодой

После запуска deepseek_client.py просто спрашивайте о погоде на естественном языке:

👤 Вы: Какая погода в Москве? 🤖 Deepseek: [Проверяет текущую погоду в Москве через API и показывает результат] 👤 Вы: А какой прогноз на 5 дней для Санкт-Петербурга? 🤖 Deepseek: [Показывает прогноз на 5 дней] 👤 Вы: Что лучше надеть в Лондоне сегодня? 🤖 Deepseek: [Проверяет погоду и дает рекомендации] 👤 Вы: выход 👋 До свидания!

Работа с данными о начислениях (Ozon)

После запуска API (см. раздел "Запуск API для работы с БД") можно запрашивать данные:

👤 Вы: Покажи статистику по начислениям 🤖 Deepseek: [Запрашивает /stats/summary и показывает общую сводку: кол-во записей, платформы, типы] 👤 Вы: Сколько начислений по услугам доставки? 🤖 Deepseek: [Запрашивает /stats/accruals?service_group=Услуги+доставки и показывает статистику] 👤 Вы: Покажи список последних начислений с платформы Ozon 🤖 Deepseek: [Запрашивает /accruals?sales_platform=Ozon&limit=50 и показывает записи] 👤 Вы: выход 👋 До свидания!

🔧 Описание модулей

modules/config.py

Отвечает за: конфигурацию приложения, загрузку переменных окружения, валидацию ключей API.

Основные компоненты:

  • Config - класс с константами конфигурации

  • validate() - проверяет наличие критических переменных окружения

  • get_config_summary() - возвращает сводку конфигурации для логирования

modules/weather_api.py

Отвечает за: взаимодействие с OpenWeatherMap API для получения данных о погоде.

Основные функции:

  • make_weather_request() - вспомогательная функция для HTTP запросов к API

  • get_current_weather() - получает текущую погоду для города

  • get_forecast() - получает прогноз на несколько дней

  • format_day_forecast() - форматирует прогноз на один день

modules/deepseek_api.py

Отвечает за: взаимодействие с Deepseek API для обработки запросов пользователя с использованием инструментов (функций).

Основные функции:

  • get_weather_tools() - возвращает определение инструментов для Deepseek

  • call_deepseek_with_tools() - вызывает Deepseek с поддержкой инструментов (function calling)

  • process_deepseek_response() - обрабатывает ответ от Deepseek, выполняет вызовы инструментов

  • get_weather_response() - главная функция для получения ответа о погоде

Поддерживаемые инструменты:

  • Погода: get_current_weather, get_forecast

  • Файлы: read_file, create_file, update_file, append_to_file, delete_file, list_files

modules/file_api.py

Отвечает за: безопасную работу с файлами по определённому пути.

Основные функции:

  • read_file() - чтение содержимого файла

  • create_file() - создание нового файла

  • update_file() - обновление содержимого файла

  • append_to_file() - добавление содержимого в файл

  • delete_file() - удаление файла

  • list_files() - просмотр содержимого директории

  • is_path_safe() - проверка безопасности пути (предотвращает path traversal атаки)

Примеры команд для Deepseek:

  • "Создай файл test.txt с текстом 'Hello World'"

  • "Прочитай содержимое файла README.md"

  • "Обнови файл config.py на новый код"

  • "Покажи список файлов в папке modules"

  • "Добавь новую строку в файл notes.txt"

  • "Удали временный файл temp.txt"

server.py

Отвечает за: запуск MCP сервера с инструментами для интеграции с другими приложениями.

Основные инструменты MCP:

  • current_weather() - инструмент для получения текущей погоды

  • weather_forecast() - инструмент для получения прогноза

Для запуска только MCP сервера (для интеграции с другими приложениями):

uv run mcp dev server.py

Удалённые локальные модули

Ранее в репозитории были утилиты для локальной загрузки данных и локальный API:

  • modules/db.py — локальная SQLAlchemy модель и хелперы для создания таблиц

  • modules/db_loader.py — скрипт загрузки Excel (pandas → БД)

  • modules/api.py — FastAPI приложение для доступа к данным о начислениях

Эти файлы удалены из текущего репозитория в пользу использования удалённых сервисов (базы данных и API). Если вам нужно восстановить локальную загрузку или локальный API, можно восстановить соответствующие модули и добавить в requirements.txt зависимости: pandas, openpyxl, sqlalchemy, psycopg2-binary, uvicorn.

deepseek_client.py

Отвечает за: главную точку входа приложения - интерактивный чат с пользователем.

Основные функции:

  • chat_with_deepseek() - интерактивный цикл чата с естественным языком

  • main() - инициализация и запуск приложения

Для запуска полного приложения:

python3 deepseek_client.py

Это команда, которая вам нужна! Она запускает интерактивный чат с Deepseek, который использует реальные данные о погоде из OpenWeatherMap API и может запрашивать данные о начислениях (если API запущен).

🌐 Схема взаимодействия

Пользователь ↓ deepseek_client.py (chat_with_deepseek) ↓ modules/deepseek_api.py (get_weather_response) ↓ Deepseek API ├─ Анализирует запрос └─ Вызывает инструменты (function calling) ↓ modules/weather_api.py ├─ get_current_weather() └─ get_forecast() ↓ OpenWeatherMap API ↓ Возвращает реальные данные о погоде ↓ Deepseek API (обработка результатов инструментов) ↓ Финальный ответ пользователю

🔌 Добавление новых функций

Чтобы добавить новый инструмент (например, получение качества воздуха):

  1. Добавьте функцию в модуль

async def get_air_quality(city: str) -> str: """Получить качество воздуха для города""" # Реализация... return result
  1. Добавьте определение инструмента в

def get_weather_tools() -> List[Dict[str, Any]]: tools = [ # ... существующие инструменты ... { "type": "function", "function": { "name": "get_air_quality", "description": "Получить качество воздуха", # ... параметры ... } } ] return tools
  1. Добавьте обработку в

if tool_name == "get_air_quality": result = await get_air_quality(tool_args.get("city"))
  1. Добавьте инструмент в MCP сервер

@mcp.tool() async def air_quality(city: str) -> str: """Инструмент MCP для получения качества воздуха""" return await get_air_quality(city)

📊 Логирование

Приложение использует встроенный модуль logging для отслеживания всех операций. Логи записываются в файл app.log и выводятся в консоль.

Уровни логирования:

  • DEBUG - подробная информация для отладки

  • INFO - основная информация о работе

  • WARNING - предупреждения

  • ERROR - ошибки

  • CRITICAL - критические ошибки

Уровень логирования можно настроить через переменную окружения LOG_LEVEL в .env.

🧪 Тестирование только сервера

Если хотите протестировать MCP сервер без клиента:

# Используйте MCP Inspector uv run mcp dev server.py # Или установите в Claude Desktop uv run mcp install server.py --name "Weather Service"

🐛 Поиск и решение проблем

Ошибка: "OPENWEATHER_API_KEY не найден"

Решение: Убедитесь, что файл .env находится в корне проекта и содержит OPENWEATHER_API_KEY=ваш_ключ

Ошибка: "Не удалось получить погоду для города"

Решение:

  • Проверьте написание названия города

  • Убедитесь, что у вас есть интернет подключение

  • Проверьте, не исчерпан ли лимит бесплатного плана OpenWeatherMap

Ошибка: "Ошибка при обращении к Deepseek API"

Решение:

  • Проверьте, что DEEPSEEK_API_KEY скопирован правильно

  • Убедитесь, что на вашем счёте есть баланс для API запросов

  • Проверьте статус Deepseek API на https://status.deepseek.com/

📝 Лицензия

Этот проект лицензирован под MIT License.

🤝 Контрибьютинг

Приветствуются pull requests! Для больших изменений сначала откройте issue для обсуждения.

🛠️ Доступные инструменты

get_current_weather

Получает текущую погоду для города

Параметры:

  • city (обязательный): Название города

  • units (опционально): "metric" или "imperial"

get_forecast

Получает прогноз погоды на несколько дней

Параметры:

  • city (обязательный): Название города

  • days (опционально): Количество дней (1-5)

  • units (опционально): "metric" или "imperial"

🌐 Архитектура с удалённым FastAPI

Проект использует двухуровневую архитектуру:

Локальный слой (ваша машина)

  • deepseek_client.py - интерактивный чат с Deepseek

  • modules/deepseek_api.py - интеграция с Deepseek для обработки запросов

  • modules/weather_api.py - получение данных о погоде

  • modules/file_api.py - файловые операции

Удалённый слой (другой хост 192.168.0.137:8000)

  • fastapi_udalennii/app/main.py - REST API для работы с начислениями (accruals)

  • fastapi_udalennii/app/models.py - SQLAlchemy таблицы (users, accruals)

  • fastapi_udalennii/app/crud.py - операции БД

  • fastapi_udalennii/app/schemas.py - валидация данных (Pydantic)

База данных (PostgreSQL)

  • Хост: 192.168.0.134:5432

  • База: mydb

  • Пользователь: asx

Схема взаимодействия:

Пользователь ↓ deepseek_client.py ↓ Deepseek API (обработка запроса) ├─ Погода → modules/weather_api.py → OpenWeatherMap API ├─ Файлы → modules/file_api.py → локальная ФС └─ Начисления → httpx HTTP запрос → fastapi_udalennii (192.168.0.137:8000) ├─ GET /accruals/ → fastapi_udalennii/app/crud.py → PostgreSQL ├─ GET /stats/summary → fastapi_udalennii/app/crud.py → PostgreSQL └─ POST /accruals/ → fastapi_udalennii/app/crud.py → PostgreSQL ↓ Deepseek API (формирует ответ) ↓ Пользователю

Новые endpoints в FastAPI:

После развёртывания на удалённом сервере (см. DEPLOYMENT_INSTRUCTIONS.md) доступны:

Accruals endpoints:

  • POST /accruals/ - создание новой записи о начислении

  • GET /accruals/ - получение списка с фильтрацией

Stats endpoints:

  • GET /stats/summary - общая статистика по всем начислениям

  • GET /stats/accruals - статистика с фильтрацией

Примеры запросов:

# Получить все начисления curl http://192.168.0.137:8000/accruals/ # Получить начисления по платформе Ozon curl "http://192.168.0.137:8000/accruals/?sales_platform=Ozon&limit=50" # Получить статистику curl http://192.168.0.137:8000/stats/summary # Создать новое начисление curl -X POST http://192.168.0.137:8000/accruals/ \ -H "Content-Type: application/json" \ -d '{ "id_accrual": "ACC001", "accrual_date": "2025-12-08", "service_group": "Доставка", "accrual_type": "Комиссия", "sales_platform": "Ozon", "total_amount_rub": 1234.56 }'

⚙️ Развёртывание и обновления

Для развёртывания обновлённого FastAPI на удалённом сервере смотрите инструкции в DEPLOYMENT_INSTRUCTIONS.md.

Краткая схема:

  1. Синхронизация кода через rsync

  2. Активация venv на удалённом сервере

  3. Установка зависимостей (если добавлены новые)

  4. Запуск миграций Alembic

  5. Перезагрузка FastAPI сервиса

⚠️ Важные замечания

  1. Не используйте - это сломает STDIO транспорт

  2. Храните - добавьте в .gitignore

  3. Лимиты API:

    • OpenWeatherMap Free: 1000 запросов/день

    • Deepseek: зависит от вашего плана

  4. Стоимость Deepseek: Более дешевая чем OpenAI

  5. Миграции БД: После обновления FastAPI кода обязательно запустите alembic upgrade head

🐛 Решение проблем

Ошибка: "OPENWEATHER_API_KEY не найден"

  • Проверьте, что файл .env создан и содержит ключ

  • Убедитесь, что файл находится в той же папке, что и скрипты

Ошибка: "Не удалось получить погоду"

  • Проверьте правильность написания города

  • Попробуйте английское название города

Сервер не запускается

  • Убедитесь, что виртуальное окружение активировано

  • Проверьте, что все зависимости установлены

📚 Полезные ссылки

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ASXRND/MCP_deepseek'

If you have feedback or need assistance with the MCP directory API, please join our Discord server