天气查询服务

一个通过OpenWeatherMap API和Deepseek API提供天气查询和预测服务的模块化MCP服务器。

  • by ASXRND
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 ASXRND/MCP_deepseek

使用说明

🌤️ 带Deepseek的MCP天气服务器

一个简单的MCP服务器,通过OpenWeatherMap API获取天气,使用Deepseek API作为接口,并支持模块化体系结构。

📋 这是怎么回事?

  • 🌍 通过OpenWeatherMap API获取任何城市的当前天气
  • 📅 显示几天的天气预报
  • 🤖 使用Deepseek与真实数据进行自然通信和调用工具
  • 📦 与远程PostgreSQL数据库和Fastapi集成以处理应计负债数据
  • 🔧 实现将AI连接到外部数据的MCP协议
  • 🏗️ 具有异步操作的模块化体系结构

📁 项目结构

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:

  • 开放天气地图:

    1. 注册https://openweathermap.org
    2. 转到API密钥部分
    3. 复制密钥(免费计划:1000次查询/天)
  • 深度求索:

    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() 使用功能调用(function calling)调用Deepseek
  • 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() -路径安全检查(防止路径交叉攻击)

Deepseek命令示例:

  • “创建一个test.txt文件,上面写着‘hello world’”
  • “读取readme.md文件的内容”
  • “将Config.py文件更新到新代码”
  • “显示模块文件夹中的文件列表”
  • “向Notes.txt文件添加新行”
  • “删除临时Temp.txt文件”

server.py

负责: 使用与其他应用程序集成的工具启动MCP服务器。

MCP主要工具:

  • current_weather() -获取当前天气的工具
  • weather_forecast() -获取预测的工具

仅运行MCP服务器(与其他应用程序集成):

uv run mcp dev server.py

远程本地模块

以前,存储库中有用于本地数据加载和本地API的工具:

  • modules/db.py -本地Sclalchemy模型和用于创建表的帮助程序
  • 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启动交互式聊天,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. 将功能添加到模块 modules/weather_api.py:
async def get_air_quality(city: str) -> str:
    """Получить качество воздуха для города"""
    # Реализация...
    return result
  1. 将工具定义添加到 modules/deepseek_api.py:
def get_weather_tools() -> List[Dict[str, Any]]:
    tools = [
        # ... существующие инструменты ...
        {
            "type": "function",
            "function": {
                "name": "get_air_quality",
                "description": "Получить качество воздуха",
                # ... параметры ...
            }
        }
    ]
    return tools
  1. 将处理添加到 process_deepseek_response():
if tool_name == "get_air_quality":
    result = await get_air_quality(tool_args.get("city"))
  1. 将工具添加到MCP服务器 server.py:
@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时出现错误”

解决办法:

  • 验证deepseeku apiu key是否正确复制
  • 验证您的帐户是否有API查询余额
  • 检查Deepseek API的状态https://status.deepseek.com/

📝 许可证

这个项目是根据MIT许可证授权的。

🤝 保险

欢迎Pull Requests!要进行重大更改,请首先打开Issue进行讨论。

🛠️ 可用工具

get_current_weather

获取城市当前天气

参数:

  • city (必填):城市名称
  • units (可选):“Metric”或“Imperial”

get_forecast

收到几天的天气预报

参数:

  • city (必填):城市名称
  • days (可选):天数(1-5)
  • units (可选):“Metric”或“Imperial”

🌐 Fastapi远程架构

项目使用 双层架构:

本地层(您的机器)

  • deepseek_client.py -与Deepseek进行交互式聊天
  • 模块/deepseek_api.py -与Deepseek集成以处理请求
  • 模块/weather_api.py -获取天气数据
  • 模块/file_api.py -文件操作

远程层(另一主机192.168.0.137:8000)

  • fastapi_udalennii/app/main.py REST API(Accruals)
  • fastapi_udalennii/app/models.py -sclalchemy表(用户,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 (формирует ответ)
    ↓
Пользователю

Fastapi中的新Endpoints:

在远程服务器上部署后(见下文)。 DEPLOYMENT_INSTRUCTIONS.md)可用:

应计项目终点:

  • POST /accruals/ -创建新的权责发生制记录
  • GET /accruals/ -获取过滤列表

统计端点:

  • 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. 不要使用 print() 在server.py -这会破坏STDIO运输
  2. 食品 .env 安全 -添加到 .gitignore
  3. API限制:
    • OpenWeatherMap Free:1000个查询/天
    • Deepseek:取决于您的计划
  4. Deepseek的价格比OpenAI便宜
  5. 移民BD:更新Fastapi代码后,一定要运行 alembic upgrade head

🐛 解决问题

错误:“openweather_api_key找不到”

  • 检查文件 .env 创建并包含密钥
  • 确保文件与脚本位于同一文件夹中。

错误:“无法检索天气”

  • 检查城市拼写的正确性
  • 试试这个城市的英文名字。

服务器无法启动

  • 确保虚拟环境已激活
  • 检查是否已安装所有依赖项

📚 有用的链接