Weather & Tasks MCP Server with AI Agent
MCP (Model Context Protocol) сервер для получения данных о погоде и управления задачами с интеллектуальными уведомлениями и AI-агентом.
Описание
Этот сервер реализует протокол MCP и предоставляет инструменты для:
Погода:
- Текущей погоды для указанного города
- 5-дневного прогноза погоды
- Текущего времени, даты и часового пояса города
Управление задачами (Tasks):
- Создание задач с автогенерацией заголовка из описания
- Управление задачами: просмотр, фильтрация, удаление
- Повторяющиеся задачи (DAILY, WEEKLY, MONTHLY)
- Уровни важности (LOW, MEDIUM, HIGH, URGENT)
- SQLite база данных для хранения
- Фильтрация по дате и важности
- Автоматические сводки по задачам
Интеллектуальные уведомления:
- Автоматическая проверка задач каждую минуту
- Извлечение города из текста задачи
- Обогащение уведомлений данными о погоде и времени
- Отправка в Telegram с красиво форматированным сообщением
- Поддержка повторяющихся задач
AI Агент (DeepSeek):
- Анализ задачи и извлечение контекстной информации
- Интеграция с MCP tools (погода, время)
- Формирование персонализированных уведомлений
- Отправка через Telegram
Возможности
- Реализация MCP протокола (JSON-RPC 2.0)
- Интеграция с OpenWeatherMap API
- Поддержка различных единиц измерения (metric, imperial, standard)
- AI агент с моделью DeepSeek для обработки задач
- Scheduler для автоматической проверки задач (каждую минуту)
- Повторяющиеся задачи с автоматическим перепланированием
- Контейнеризация с Docker
- Health check endpoints
- Автоматическое логирование
Технологии
- Kotlin
- Ktor (Web Framework)
- kotlinx.serialization (JSON сериализация)
- kotlinx.coroutines (асинхронность)
- Exposed ORM + SQLite (база данных)
- Docker & Docker Compose
- OpenWeatherMap API (погода и координаты)
- WorldTimeAPI (время и часовые пояса)
- DeepSeek API (AI агент с function calling)
Предварительные требования
- JDK 17 или выше (для локальной разработки)
- Docker и Docker Compose (для контейнерного развертывания)
- API ключ от OpenWeatherMap (получить на https://openweathermap.org/api)
- API ключ от DeepSeek (опционально, для AI агента - получить на https://platform.deepseek.com/)
Установка и запуск
Локальный запуск
- Клонируйте репозиторий
- Создайте файл
.envна основе.env.example:
cp .env.example .env- Добавьте ваши API ключи в
.env:
OPENWEATHER_API_KEY=ваш_api_ключ
TELEGRAM_ENABLED=true
TELEGRAM_BOT_TOKEN=ваш_telegram_токен
TELEGRAM_CHAT_ID=ваш_chat_id- Запустите сервер:
export OPENWEATHER_API_KEY=ваш_api_ключ
./gradlew runЗапуск через Docker
- Создайте файл
.env:
cp .env.example .env- Добавьте ваши API ключи в
.env
- Соберите и запустите контейнер:
docker-compose up -d- Проверьте статус:
docker-compose ps- Просмотр логов:
docker-compose logs -fОбновление и повторное развертывание в Docker
При обновлении кода сервера база данных с задачами автоматически сохраняется благодаря Docker volumes.
Обновление сервера с сохранением данных
# 1. Получите последние изменения кода
git pull
# 2. Остановите контейнер (данные в volume сохранятся!)
docker-compose down
# 3. Пересоберите образ с новым кодом
docker-compose build --no-cache
# 4. Запустите обновленный контейнер
docker-compose up -d
# 5. Проверьте логи для подтверждения успешного запуска
docker-compose logs -fВажно: Сохранность данных
- База данных хранится в Docker volume
task-data - При выполнении
docker-compose downконтейнер удаляется, но volume остается - Все задачи и настройки сохраняются между перезапусками
- База автоматически создается при первом запуске
API Endpoints
Health Check
GET /healthВозвращает статус сервера и информацию о включенных модулях:
{
"status": "healthy",
"tasks": "enabled"
}MCP Endpoint
POST /mcp
Content-Type: application/jsonMCP Tools
Погодные инструменты
1. get_current_weather
Получить текущую погоду для города.
Параметры:
city(обязательный): Название города (например, "London", "Moscow", "Москва")units(опциональный): Единицы измерения - "metric" (по умолчанию), "imperial", "standard"
Пример запроса:
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "get_current_weather",
"arguments": {
"city": "Moscow",
"units": "metric"
}
}
}2. get_weather_forecast
Получить 5-дневный прогноз погоды.
Параметры:
city(обязательный): Название городаunits(опциональный): Единицы измерения
3. get_city_time
Получить текущее время, дату и информацию о часовом поясе для города.
Параметры:
city(обязательный): Название города
Пример ответа:
🕐 Time in Tokyo, JP
Current time: 15:30:45
Current date: 2024-12-17
Day of week: Tuesday
Timezone: Asia/Tokyo
UTC offset: +09:00
DST active: No
Unix timestamp: 1702814445Инструменты для управления задачами
4. add_task
Создать новую задачу. Если заголовок не указан, он будет автоматически сгенерирован из описания.
Параметры:
title(опциональный): Краткое название задачи (если не указан, генерируется из description)description(обязательный): Детальное описание задачиreminder_time(обязательный): Время напоминания в ISO формате (2024-12-17T15:30:00) - время сервераrecurrence(опциональный): Повторение - DAILY, WEEKLY, MONTHLYimportance(опциональный): Важность - LOW, MEDIUM, HIGH, URGENT (по умолчанию MEDIUM)
Пример запроса:
{
"jsonrpc": "2.0",
"id": "4",
"method": "tools/call",
"params": {
"name": "add_task",
"arguments": {
"title": "Встреча в Москве",
"description": "Обсудить результаты квартала и планы на следующий",
"reminder_time": "2024-12-20T14:00:00",
"recurrence": "WEEKLY",
"importance": "HIGH"
}
}
}Пример с автогенерацией заголовка:
{
"jsonrpc": "2.0",
"id": "5",
"method": "tools/call",
"params": {
"name": "add_task",
"arguments": {
"description": "Проверить погоду в Санкт-Петербурге и взять зонт если нужно",
"reminder_time": "2024-12-18T08:00:00",
"importance": "MEDIUM"
}
}
}5. list_tasks
Получить список всех задач или отфильтровать по статусу.
Параметры:
status(опциональный): Фильтр по статусу - ACTIVE, COMPLETED
Пример запроса:
{
"jsonrpc": "2.0",
"id": "6",
"method": "tools/call",
"params": {
"name": "list_tasks",
"arguments": {
"status": "ACTIVE"
}
}
}6. get_task
Получить детальную информацию о конкретной задаче.
Параметры:
id(обязательный): ID задачи
7. complete_task
Пометить задачу как выполненную.
Параметры:
id(обязательный): ID задачи
8. delete_task
Удалить задачу.
Параметры:
id(обязательный): ID задачи
9. get_tasks_for_date
Получить все задачи на конкретную дату.
Параметры:
date(обязательный): Дата в ISO формате (2024-12-17)
Пример запроса:
{
"jsonrpc": "2.0",
"id": "9",
"method": "tools/call",
"params": {
"name": "get_tasks_for_date",
"arguments": {
"date": "2024-12-20"
}
}
}10. get_tasks_by_importance
Получить задачи отфильтрованные по уровню важности.
Параметры:
importance(обязательный): Уровень важности - LOW, MEDIUM, HIGH, URGENT
Пример запроса:
{
"jsonrpc": "2.0",
"id": "10",
"method": "tools/call",
"params": {
"name": "get_tasks_by_importance",
"arguments": {
"importance": "HIGH"
}
}
}11. get_tasks_summary
Получить сводку по всем задачам (статистика, просроченные, приоритетные, предстоящие).
Пример запроса:
{
"jsonrpc": "2.0",
"id": "11",
"method": "tools/call",
"params": {
"name": "get_tasks_summary",
"arguments": {}
}
}12. set_notification_schedule
Настроить автоматические периодические уведомления со сводкой по задачам.
Параметры:
interval_minutes(обязательный): Интервал в минутах (60 = каждый час, 1440 = раз в день)enabled(опциональный): Включить/выключить уведомления (по умолчанию true)
Пример запроса:
{
"jsonrpc": "2.0",
"id": "12",
"method": "tools/call",
"params": {
"name": "set_notification_schedule",
"arguments": {
"interval_minutes": 1440,
"enabled": true
}
}
}13. get_notification_schedule
Получить текущие настройки расписания уведомлений.
14. send_test_notification
Отправить тестовое уведомление немедленно для проверки конфигурации.
Работа системы интеллектуальных уведомлений
Как работает система
- Scheduler проверяет базу данных каждую минуту
- Находит задачи с наступившим временем (
reminderDateTime /getUpdates
- Найдите ваш chat.id в ответе
- Настройте переменные в
.env:
TELEGRAM_ENABLED=true
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
TELEGRAM_CHAT_ID=your_chat_idDeepSeek AI Agent
- Получите API ключ от DeepSeek:
- Зарегистрируйтесь на https://platform.deepseek.com/ - Создайте API ключ в разделе API Keys - Скопируйте ключ
- Настройте переменные в
.env:
AGENT_ENABLED=true
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1 # опционально- Убедитесь, что задачи включены (требуется для работы):
TASKS_ENABLED=trueИспользование 24/7
Для работы сервера 24/7 с автоматическими уведомлениями:
- Разверните сервер на VPS (через Docker)
- Настройте Telegram уведомления
- Создайте задачи через MCP инструменты
- Система автоматически будет проверять задачи каждую минуту и отправлять уведомления!
Тестирование
# Проверка здоровья сервера
curl http://localhost:8080/health
# Тест MCP initialize
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "1",
"method": "initialize"
}'
# Тест создания задачи
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "2",
"method": "tools/call",
"params": {
"name": "add_task",
"arguments": {
"title": "Тестовая задача",
"description": "Проверка работы системы в Москве",
"reminder_time": "2024-12-20T15:00:00",
"importance": "HIGH"
}
}
}'
# Тест получения погоды
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "3",
"method": "tools/call",
"params": {
"name": "get_current_weather",
"arguments": {
"city": "Moscow",
"units": "metric"
}
}
}'Разработка
Сборка проекта
./gradlew buildЗапуск тестов
./gradlew testСборка Fat JAR
./gradlew buildFatJarСборка Docker образа
docker build -t mcp-weather-server:latest .Структура проекта
src/
├── main/
│ ├── kotlin/
│ │ └── com/bazik/
│ │ ├── mcp/
│ │ │ ├── models/ # MCP модели данных
│ │ │ └── McpService.kt # MCP бизнес-логика
│ │ ├── weather/
│ │ │ ├── models/ # OpenWeatherMap модели
│ │ │ └── WeatherService.kt # Работа с Weather API
│ │ ├── time/
│ │ │ ├── models/ # TimeZone модели
│ │ │ └── TimeService.kt # Работа со временем
│ │ ├── reminder/
│ │ │ ├── models/ # Модели задач
│ │ │ ├── TaskRepository.kt # Работа с БД
│ │ │ ├── TaskService.kt # Бизнес-логика задач
│ │ │ ├── SchedulerService.kt # Планировщик
│ │ │ └── NotificationService.kt # Уведомления
│ │ ├── agent/
│ │ │ ├── models/ # Модели агента
│ │ │ ├── AgentService.kt # DeepSeek интеграция
│ │ │ └── AgentIntegrationService.kt # Обработка задач
│ │ ├── Application.kt # Точка входа
│ │ ├── Routing.kt # Маршруты и инициализация
│ │ └── Serialization.kt # Настройка сериализации
│ └── resources/
│ └── application.conf # КонфигурацияАрхитектура
User creates Task
↓
TaskRepository (SQLite)
↓
SchedulerService (каждую минуту)
↓
AgentIntegrationService.processTaskNotification()
↓
┌─────────────────┐
│ Извлечь город │
│ из текста │
└────────┬────────┘
↓
┌──────┴──────┐
│ │
Город найден Город не найден
│ │
↓ ↓
Погода/время Погода для 3 городов
для города (Москва, СПб, Казань)
│ │
└──────┬──────┘
↓
Формирование сообщения
↓
Telegram отправка
↓
markTaskAsProcessed()
↓
┌──────┴──────┐
│ │
recurrence? recurrence?
да нет
│ │
↓ ↓
Следующая дата isCompleted = trueTroubleshooting
Ошибка "API key is not configured"
Убедитесь, что переменная окружения OPENWEATHER_API_KEY установлена.
Контейнер не запускается
Проверьте логи:
docker-compose logsПорт 8080 занят
Измените порт в docker-compose.yml или .env:
ports:
- "8081:8080" # Используем 8081 вместо 8080Telegram уведомления не приходят
- Проверьте токен бота и chat ID
- Убедитесь, что бот имеет доступ к chat
- Проверьте логи:
docker-compose logs -f | grep -i telegramЗадачи не обрабатываются
- Убедитесь что
AGENT_ENABLED=trueиTASKS_ENABLED=true - Проверьте что время задачи наступило
- Проверьте логи scheduler:
docker-compose logs -f | grep -i schedulerЛицензия
MIT
