使用说明
🌤️ 带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:
-
开放天气地图:
- 注册https://openweathermap.org
- 转到API密钥部分
- 复制密钥(免费计划:1000次查询/天)
-
深度求索:
- 注册https://platform.deepseek.com
- 创建新的API密钥
- 补充余额(免费贷款~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)调用Deepseekprocess_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.pyExcel下载脚本(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 (обработка результатов инструментов)
↓
Финальный ответ пользователю
🔌 添加新功能
添加新工具(例如空气质量):
- 将功能添加到模块
modules/weather_api.py:
async def get_air_quality(city: str) -> str:
"""Получить качество воздуха для города"""
# Реализация...
return result
- 将工具定义添加到
modules/deepseek_api.py:
def get_weather_tools() -> List[Dict[str, Any]]:
tools = [
# ... существующие инструменты ...
{
"type": "function",
"function": {
"name": "get_air_quality",
"description": "Получить качество воздуха",
# ... параметры ...
}
}
]
return tools
- 将处理添加到
process_deepseek_response():
if tool_name == "get_air_quality":
result = await get_air_quality(tool_args.get("city"))
- 将工具添加到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.
简要方案:
- 代码同步
rsync - 在远程服务器上激活VENV
- 建立依赖关系(如果添加了新的依赖关系)
- 启动Alembic迁移
- 重新启动Fastapi服务
⚠️ 重要评论
- 不要使用
print()在server.py -这会破坏STDIO运输 - 食品
.env安全 -添加到.gitignore - API限制:
- OpenWeatherMap Free:1000个查询/天
- Deepseek:取决于您的计划
- Deepseek的价格比OpenAI便宜
- 移民BD:更新Fastapi代码后,一定要运行
alembic upgrade head
🐛 解决问题
错误:“openweather_api_key找不到”
- 检查文件
.env创建并包含密钥 - 确保文件与脚本位于同一文件夹中。
错误:“无法检索天气”
- 检查城市拼写的正确性
- 试试这个城市的英文名字。
服务器无法启动
- 确保虚拟环境已激活
- 检查是否已安装所有依赖项