旅行顾问AI 🌍✈️
一个基于……构建的智能旅行推荐系统 清洁架构, Python 3, 人工智能代理,和 HTTP可流式传输MCP协议。
🎯 项目概述
旅行顾问AI是一个先进的旅行推荐系统,能够回答诸如以下复杂查询:
*“我想带着4000美元去一个温暖、安全的地方旅行,那里的当地货币比美元弱。”*
该系统通过HTTP流式端点集成多个公共API,利用智能代理进行上下文分析,并提供个性化的旅行建议 实时流媒体 基于气候、汇率、安全性和预算限制。
🚀 新功能 - HTTP 可流式传输协议
- 实时流媒体用于实时进度更新的服务器发送事件(SSE)
- HTTP REST API易于与Web应用程序和移动应用程序集成
- 自动生成的文档交互式API文档位于
/docs - 健康监测内置健康检查和服务状态
- CORS 支持已启用跨域请求以进行网页集成
- 无需复杂的握手过程直接进行HTTP调用,无需MCP初始化
🏗️ 建筑与方法论
架构实现(或:架构实施)
这个项目紧接在……之后 清洁架构 具有明确关注点分离的原则:
src/
├── domain/ # Business entities and rules (innermost layer)
│ ├── entities/ # Core business objects
│ ├── repositories/ # Abstract interfaces
│ └── value_objects/# Domain value objects
├── application/ # Use cases and application services
│ ├── services/ # Application services
│ └── use_cases/ # Business use cases
├── infrastructure/ # External concerns (outermost layer)
│ ├── adapters/ # External service implementations
│ └── container.py # Dependency injection
└── presentation/ # UI and controllers
├── controllers/ # Request handlers
└── ui/ # User interfaces应用SOLID原则
- 单一职责每个类都有一个变化的原因
- 开放/关闭对扩展开放,对修改关闭
- 里氏替换原则接口可以被实现类替代
- 接口隔离简洁、专注的界面
- 依赖倒置依赖抽象概念,而非具体实例
设计模式
- 仓库模式(或存储库模式)数据访问抽象
- 依赖注入组件之间的松耦合
- 策略模式多种推荐算法
- 工厂模式对象创建抽象
- 观察者模式事件驱动架构
🚀 功能
核心功能
- ✅ 多因素分析气候、货币、安全和距离
- ✅ 个性化推荐基于预算的智能建议
- ✅ 实时数据实时天气、汇率及国家信息
- ✅ 表示“正确”或“对”。 持久化存储用于推荐和历史记录的SQLite数据库
- ✅ 丰富的命令行界面具有美观格式的交互式控制台
- ✅(勾选标记,表示正确、确认或完成) HTTP/REST API可通过网络访问的终端点
- ✅(对号,表示正确、同意或确认) MCP协议原生MCP服务器实现
技术特性
- ✅ 综合测试单元测试、集成测试和端到端测试
- ✅ 类型安全带有mypy支持的完整类型提示
- ✅ 错误处理强大的错误处理和回退机制
- ✅(对号,表示正确、确认或完成) 异步/等待(Async/Await)全程采用异步编程
- ✅ 代码质量黑色格式化,flake8 代码检查
- ✅ 文档全面的文档字符串和注释
🌐 API 集成
MCP服务器
- 国家服务RestCountries API + 地理位置数据
- 货币服务实时汇率API
- 气候服务开放气象API用于天气数据
使用的外部API
- RestCountries(可译为“国家信息API”或根据具体语境译为“国家数据接口”等,但“RestCountries”本身作为专有名词时,通常直接保留原名或译为“REST国家信息”)国家信息和地理数据
- 汇率API货币汇率(免费版)
- Open-Meteo(可译为“开放气象”或保持原名,根据语境选择是否翻译)天气和气象数据(无需API密钥)
📦 安装
先决条件
- Python 3.11或更高版本
- pip 包管理器
设置
# Clone the repository
git clone
cd travelling_mcp
# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt🎮 使用方法
选项1:MCP服务器(原生协议)🚀
python3 mcp_travel_server.py- 协议通过标准I/O的原生MCP
- 使用方法对于MCP兼容的客户端(如Claude Desktop、Cline等)
- 特点/特性全面支持MCP协议,工具调用,资源管理
选项2:HTTP流式服务器(Web API)
python3 http_server.py --host 0.0.0.0 --port 8000- URL(统一资源定位符)http://localhost:8000
- 文档http://localhost:8000/docs 翻译为中文是:“本地主机上的8000端口文档页面”。不过,通常我们不会直接翻译网址,而是根据网址内容来解释其含义。在这个例子中,网址指向的是运行在本地主机(即你自己的计算机)上的某个服务的文档页面,该服务监听8000端口。所以,也可以简化为“本地8000端口服务的文档页面”
- 健康检查http://localhost:8000/health 翻译成中文是:“本地主机上的8000端口健康检查页面”。不过,通常我们不会直接翻译URL地址,而是解释其含义或用途。在这个例子中,可以理解为这是一个用于检查本地服务器(运行在localhost上,即本机)8000端口健康状态的网页或API接口
- 流媒体播放http://localhost:8000/stream 翻译为中文是:“本地主机上的8000端口流(或实时流)服务”。不过,具体翻译可能会根据上下文有所调整,但基本上这个网址表示的是访问本地计算机上运行的一个在8000端口上的流媒体或实时数据传输服务
- 特点/特性实时流媒体、自动生成文档、支持跨域资源共享(CORS)
选项3:交互式控制台
python3 main.py选项4:传统HTTP服务器
python3 http_server.py --host 0.0.0.0 --port 8000选项5:演示模式
python3 main.py --demo选项6:运行测试
python3 main.py --test
# or
python3 run_tests.py🌐 HTTP 可流式传输 API 端点
核心终端(或核心端点)
GET /- 服务器信息和可用的端点GET /health- 健康检查和服务状态GET /tools- 列出所有可用的工具/功能POST /mcp- 直接MCP工具调用(JSON-RPC风格)POST /stream- 使用服务器发送事件(Server-Sent Events)进行流式响应GET /resources/{path}- 访问MCP资源(国家、地区)
示例用法
直接API调用
curl -X POST http://localhost:8000/mcp \
-H "Content-Type: application/json" \
-d '{"method": "search_countries", "params": {"query": "Brazil", "limit": 5}}'流式API调用
curl -X POST http://localhost:8000/stream \
-H "Content-Type: application/json" \
-d '{"method": "get_travel_recommendations", "params": {"user_id": "user123", "budget": 4000}}' \
--no-buffer健康检查
curl http://localhost:8000/health🔧 MCP 客户端配置
该服务器可与MCP兼容的客户端一起使用,如Claude Desktop、Cline或其他MCP客户端。以下是配置示例:
Claude 桌面配置
添加到您的Claude桌面 claude_desktop_config.json:
{
"mcpServers": {
"travel-server": {
"command": "/usr/bin/python3",
"args": [
"/home/matheus/projetos_praticos/travelling_mcp/mcp_travel_server.py"
],
"cwd": "/home/matheus/projetos_praticos/travelling_mcp"
}
}
}注MCP服务器使用stdio上的原生MCP协议,而非HTTP。这是与MCP客户端集成的正确方式。
Cline/VSCode MCP 配置
在您的Cline MCP设置中添加:
{
"mcpServers": {
"travel-server": {
"command": "python3",
"args": [
"/path/to/your/travelling_mcp/mcp_travel_server.py"
],
"cwd": "/path/to/your/travelling_mcp",
"env": {
"PYTHONPATH": "/path/to/your/travelling_mcp"
}
}
}
}直接执行方法
该项目为不同的使用场景提供了两种不同的MCP服务器实现:
1. 原生MCP服务器(stdio协议)
# Run native MCP server with stdio protocol for MCP clients
python3 mcp_travel_server.py用例与MCP兼容客户端(如Claude Desktop等)的集成 协议通过标准I/O库的原生MCP(可能指某种特定协议或接口,如“管理控制协议”等,具体需根据上下文确定) 交流标准输入/输出流
2. 可流式传输的HTTP MCP服务器
# Run MCP server with HTTP transport for web integration
python3 mcp_travel_server_proper.py --port 8000 --host 0.0.0.0用例网络应用、REST API客户端、基于HTTP的集成 协议通过可流式传输的HTTP进行MCP(可能是指某种数据传输或通信协议,具体需根据上下文确定) 交流HTTP POST/GET 请求 终点(或结局指标):
- Root(在计算机领域通常指获得系统的最高管理权限):
http://localhost:8000/- 服务器信息 - 健康:
http://localhost:8000/health- 健康检查 - MCP(多种含义,具体根据上下文确定):
http://localhost:8000/mcp- MCP协议端点
3. 传统HTTP服务器(已弃用)
# Run legacy HTTP server for web/REST API access
python3 http_server.py --host 0.0.0.0 --port 8000注这是传统的实现方式。对于新的集成,请使用选项2。
4. 使用主模块
# From project directory
python3 -m mcp_travel_server🔧 服务器对比
| 特性 | 原生MCP(stdio) | 可流式传输的HTTP MCP | 传统HTTP | ||||
|---|---|---|---|---|---|---|---|
| (无对应中文) | (无对应中文) | (无对应中文) | (无对应中文) | ** | ** 文件 mcp_travel_server.py | mcp_travel_server_proper.py | http_server.py |
| ** | ** 协议;规程 | ||||||
| 根据提供的信息,以下是原文内容的翻译: **** | 通过标准I/O的MCP | 通过HTTP的MCP | 自定义REST API | ||||
| 用例 | MCP 客户端 | Web 应用程序 | 旧版系统集成 | ||||
| 交流 | 标准输入/输出 | HTTP 请求 | HTTP 请求 | ||||
| MCP 兼容 | ✅ 完整 | ✅ 完整 | ❌ 否 | ||||
| 网页集成 | ❌ 否 | ✅ 是 | ✅ 是 | ||||
| 文档 | - | 自动生成 | 手动 |
|
实时
travelling_mcp/
├── main.py # Main application entry point
├── mcp_travel_server.py # Native MCP Server (stdio protocol)
├── mcp_travel_server_proper.py # Streamable HTTP MCP Server
├── http_server.py # Legacy HTTP/REST API server
├── start_server.py # Server launcher utility
├── demo.py # Demonstration script
├── test_apis.py # API testing utilities
├── run_tests.py # Test runner
├── requirements.txt # Python dependencies
├── pytest.ini # Pytest configuration
├── .coveragerc # Coverage configuration
└── README.md # This file| ✅ 是 | ✅ 是 | ❌ 有限 |
📁 项目结构mcp_servers/根级别文件
countries_server.py核心模块currency_server.pyMCP 服务器(climate_server.py)
国家数据和地理信息agent/汇率与购买力分析
travel_agent.py天气数据和气候信息
智能代理(database/)
travel_database.py基于情境的旅行推荐人工智能代理
数据库层services/)
travel_service.pySQLite数据库操作与数据持久化
服务层(controllers/)
travel_controller.py业务逻辑协调
控制器(ui/)
console_interface.py请求处理和响应格式化
用户界面(src/)
- 丰富的命令行界面,带有交互式菜单清洁架构(Clean Architecture)
- )领域层
- 核心业务逻辑和实体应用层
- 用例和应用服务基础设施层
外部集成和适配器tests/表示层
- 控制器和用户界面测试 (
- )单元测试
- 单个组件测试集成测试
组件交互测试data/端到端测试
cache/完整系统工作流程测试queries/数据存储(
)
临时数据存储
- 查询历史和索引🧪 测试
- 测试覆盖率42项测试
- 全面的测试套件单元测试
- 数据库、服务、控制器、代理集成测试
端到端工作流,HTTP服务器,MCP服务器
# Run all tests
pytest
# Run with coverage
pytest --cov=. --cov-report=html
# Run specific test categories
pytest tests/unit/ # Unit tests only
pytest tests/integration/ # Integration tests only嘲弄;嘲笑
为确保可靠性,对外部API调用进行了模拟
# Optional: Set custom API endpoints
export COUNTRIES_API_URL="https://restcountries.com/v3.1"
export EXCHANGE_API_URL="https://api.exchangerate-api.com/v4/latest"
export WEATHER_API_URL="https://api.open-meteo.com/v1"运行测试
- 🔧 配置环境变量
travel_recommendations.db数据库配置 - 默认SQLite数据库(
- )位置
项目根目录
自动创建
python3 http_server.py --reload数据库和表自动创建
python3 http_server.py --host 0.0.0.0 --port 8000🚀 部署
发展
Dockerfile生产docker-compose.ymlDocker 支持docker-entrypoint.shDocker 配置文件已存在但目前未使用:
容器配置
多服务编排
GET /容器入口点GET /health📊 API 端点GET /toolsHTTP服务器端点POST /mcpAPI信息和状态POST /stream带服务状态的健康检查GET /resources/{path}可用的MCP工具
MCP协议端点
get_travel_recommendations流式传输MCP响应search_countriesMCP资源get_weather_forecastMCP 工具convert_currency获取个性化的旅行建议analyze_purchasing_power搜索并筛选国家get_user_travel_history地点的天气数据get_popular_destinations货币兑换get_server_statistics购买力分析
用户查询历史
热门目的地统计
系统统计
🛠️ MCP 服务器功能示例
以下示例展示了如何使用MCP服务器功能。这些功能可以通过MCP兼容客户端或通过HTTP API端点进行调用。主要功能
{
"method": "search_countries",
"params": {
"query": "Brazil",
"limit": 10
}
}1. 功能:搜索国家示例1
{
"method": "search_countries",
"params": {
"query": "South America",
"limit": 5
}
}搜索包含“巴西”的国家,限制为10个示例2
{
"method": "search_countries",
"params": {
"query": "Americas",
"limit": 3
}
}搜索包含“南美洲”(地区)的国家,限制为5个
示例3搜索“美洲”(地区)的国家,并限制为3个
{
"method": "get_travel_recommendations",
"params": {
"user_id": "user123",
"budget": 3000,
"duration": 10,
"preferences": {
"climate": "tropical climate",
"activities": ["beach", "culture activities"]
},
"origin_country": "Brazil"
}
}2. 功能:获取旅行建议
示例获取用户ID为“user123”、预算为3000、时长为10天、偏好为\[“热带气候”、“海滩”、“文化活动”\]且出发国家为“巴西”的旅行建议
{
"method": "get_weather_forecast",
"params": {
"location": "Rio de Janeiro",
"days": 5
}
}3. 功能:获取天气预报
示例获取里约热内卢(纬度-22.9068,经度-43.1729)未来5天的天气预报
{
"method": "convert_currency",
"params": {
"from_currency": "BRL",
"to_currency": "USD",
"amount": 1000
}
}4. 功能:货币转换
示例将1000巴西雷亚尔兑换成美元
{
"method": "analyze_purchasing_power",
"params": {
"origin_country": "Brazil",
"destination_country": "Argentina",
"budget_usd": 2000
}
}5. 功能:分析购买力
示例
分析阿根廷的购买力,预算为2000美元辅助功能
{
"method": "get_popular_destinations",
"params": {
"limit": 5
}
}6. 功能:获取热门目的地
示例获取最多5个热门目的地
{
"method": "get_user_travel_history",
"params": {
"user_id": "user123"
}
}7. 功能:获取用户旅行历史
示例获取用户ID为“user123”的用户旅行历史记录
{
"method": "get_server_statistics",
"params": {}
}8. 功能:获取服务器统计信息
示例 /mcp 获取服务器统计信息(无需参数)
curl -X POST http://localhost:8000/mcp \
-H "Content-Type: application/json" \
-d '{"method": "search_countries", "params": {"query": "Brazil", "limit": 5}}'通过HTTP API使用 /stream 你可以通过HTTP POST请求来调用这些函数至
curl -X POST http://localhost:8000/stream \
-H "Content-Type: application/json" \
-d '{"method": "get_travel_recommendations", "params": {"user_id": "user123", "budget": 3000}}' \
--no-buffer端点:
对于流式响应,请使用
- 终端节点:🤝 贡献
- 代码质量标准格式化
- 黑代码格式化工具代码检查(或代码规范检查)
- 用于代码质量的 Flake8类型检查
- 使用 mypy 确保类型安全测试
具有高覆盖率要求的Pytest
- 文档
- 全面的文档字符串
- 开发工作流程
- 为仓库创建分支(或“克隆仓库”)
- 创建一个特性分支
- 为新功能编写测试
确保所有测试通过
使用黑色格式代码
- 提交拉取请求📈 性能
- 优化特性异步/等待(Async/Await)
- 非阻塞I/O操作连接池
- 高效使用HTTP客户端缓存
- 外部API的响应缓存数据库索引
优化查询性能
- 内存管理高效的数据结构
- 监测健康检查
- 服务可用性监控错误追踪
- 全面的错误日志记录性能指标
响应时间追踪
资源使用情况
- 内存和CPU监控🔒 安全
- 安全措施输入验证
- 用于数据验证的 Pydantic 模型防止SQL注入
- 参数化查询CORS 配置
- 受控的跨域访问错误净化(或错误处理/错误修正)
安全地暴露错误信息
依赖安全性
DEMO_RESULTS.md定期的安全更新DADOS_TESTE_APIS.md📚 文档deploy_guide.md额外资源
演示结果及示例
- API测试数据和示例部署指南和最佳实践
- 代码文档文档字符串(Docstrings)
- 全面的功能和类文档类型提示
- 完整的类型注解覆盖率评论
内联代码解释
架构图
- 视觉系统概述🎉 致谢
- 所用技术Python 3
- 核心编程语言FastAPI
- 现代网络框架FastMCP
- MCP协议实现SQLite
- 嵌入式数据库丰富;富有
- 美观的终端格式化Pytest
- 测试框架Pydantic
数据验证
- HTTPX异步HTTP客户端
- 设计原则清洁架构
- 罗伯特·C·马丁的架构模式SOLID原则
- 面向对象设计原则领域驱动设计
______________________________________________________________________
业务逻辑聚焦
*测试驱动开发*
