flight-ticket-mcp-server


Nameflight-ticket-mcp-server JSON
Version 1.0.1 PyPI version JSON
download
home_pagehttps://github.com/yourusername/flight-ticket-mcp-server
Summary一个基于模型上下文协议(MCP)的航空机票查询和管理服务器
upload_time2025-08-31 10:51:42
maintainerNone
docs_urlNone
authorYour Name
requires_python>=3.11
licenseMIT
keywords mcp flight ticket search ai fastmcp
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Flight Ticket MCP Server

一个基于模型上下文协议(MCP)的航空机票查询服务器。该服务器为AI助手提供标准化的航班实时动态查询功能接口。

## 概述

Flight Ticket MCP Server 实现了供航空机票相关查询操作的工具和资源。它作为AI助手与航空服务系统之间的桥梁,专注于航班实时动态查询功能。

该服务器采用模块化架构,将核心功能、工具和实用程序分离,使其具有高度的可维护性和可扩展性。

## 功能特性

### 航班路线查询
- 根据出发地、目的地和出发日期查询可用航班
- 支持282个国内城市和机场代码
- 智能城市名称解析(支持城市名、机场代码、完整格式)
- 实时航班价格和航班时刻信息
- 航空公司和机型信息
- 航站楼和登机口信息
- 价格统计和航空公司分布
- 格式化输出结果

### 航班中转路线查询
- 根据出发地、中转地、目的地查询联程航班
- 支持自定义最小和最大中转时间(默认2-5小时)
- 智能筛选符合中转时间要求的航班组合
- 提供完整的两段航程信息
- 支持国内外航线中转查询
- 详细的中转时间计算和验证

### 天气信息查询
- **按经纬度查询**:精确地理位置天气查询
- **按城市名查询**:支持主要城市直接查询
- 支持历史、当前和未来天气数据
- 提供温度、湿度、风速、天气状况等详细信息
- 自动处理时区和日期范围
- 支持武汉、北京、上海等主要城市预设

### 航班信息查询
- 根据航班号查询详细的航班信息
- 包含航班状态、座位配置、价格信息
- 提供天气信息(出发地和目的地)
- 显示航班基本信息(航空公司、机型、航线类型)
- 详细的航站楼、登机口信息
- 实时动态状态(准时、延误、登机、飞行中等)
- 座位价格和可用性信息
- 附加服务信息(餐食、WiFi、娱乐系统等)

### 实时航班跟踪
- **航班实时状态查询**:查询航班实时位置和状态
- **机场周边航班查询**:查询指定机场周边30公里范围内的所有航班
- **区域航班查询**:查询指定地理区域内的所有实时航班
- **批量航班跟踪**:同时跟踪多个航班的实时状态
- 支持中国主要机场代码(PEK、PVG、CAN等70+机场)
- 提供详细的航班位置、速度、高度、状态信息
- 无需认证的公开API,实时更新航班数据

### 日期时间工具  
- 获取当前系统日期(YYYY-MM-DD格式)
- 获取当前系统日期时间(YYYY-MM-DD HH:mm:ss格式)
- 为其他功能提供标准化的日期时间支持
- 自动处理时区和格式转换

### 数据处理与智能化
- **智能城市解析**:支持多种城市输入格式(城市名、机场代码、完整格式)
- **参数验证**:全面的输入参数验证和错误处理
- **结果格式化**:统一的JSON格式输出,便于AI助手解析
- **错误恢复**:完善的异常处理和降级机制
- **日志记录**:详细的操作日志和调试信息

## 技术架构

### 核心模块 (Core)
- 航班数据模型和结构定义
- 机场、航空公司、航班、价格等数据模型
- 航班中转和座位配置数据结构

### 工具模块 (Tools)
- **航班搜索工具** (`flight_search_tools.py`) - 航班路线查询功能
- **航班中转工具** (`flight_transfer_tools.py`) - 多段航程和中转查询  
- **航班信息工具** (`flight_info_tools.py`) - 根据航班号查询详细信息
- **实时航班跟踪工具** (`simple_opensky_tools.py`) - 基于OpenSky Network的实时航班跟踪
- **天气查询工具** (`weather_tools.py`) - 基于经纬度和城市的天气查询
- **日期时间工具** (`date_tools.py`) - 日期时间获取和处理

### 实用工具 (Utils)
- **城市字典** (`cities_dict.py`) - 282个城市和机场代码映射
- **数据验证器** (`validators.py`) - 输入参数验证和格式检查
- **日期工具** (`date_utils.py`) - 日期格式化和时区处理
- **API客户端** (`api_client.py`) - HTTP请求封装和错误处理

### MCP集成层
- **FastMCP服务器** - 基于FastMCP框架的MCP协议实现
- **多传输协议支持** - stdio、SSE、HTTP传输协议
- **工具注册管理** - 统一的工具注册和调用机制
- **环境配置管理** - 灵活的配置和环境变量支持

## 支持的传输协议

本服务器支持三种传输协议:

1. **sse** - Server-Sent Events(默认,适用于Web应用)
2. **stdio** - 标准输入输出(适用于Claude Desktop)
3. **streamable-http** - 可流式HTTP(适用于HTTP客户端)

## 安装

### 前置要求
- Python 3.11 或更高版本
- pip 包管理器(或 uvx 工具)

### 方式一:从PyPI安装(推荐)

```bash
# 使用pip安装
pip install flight-ticket-mcp-server

# 或使用uvx直接运行(无需安装)
uvx flight-ticket-mcp-server

# 或使用uvx安装后运行
uvx --install flight-ticket-mcp-server
```

### 方式二:本地开发安装
```bash
# 克隆或下载项目
cd FlightTicketMCP

# 安装依赖
pip install -r requirements.txt

# 或从本地源码安装
pip install -e .
```

### uvx 使用说明

uvx 是一个现代的Python包运行工具,可以直接运行PyPI包而无需先安装到系统环境:

```bash
# 安装uvx(如果还没有安装)
pip install uvx

# 直接运行MCP服务器(无需安装)
uvx flight-ticket-mcp-server

# 带参数运行
uvx flight-ticket-mcp-server --help

# 指定版本运行
uvx flight-ticket-mcp-server==1.0.0

# 安装到uvx环境后运行
uvx --install flight-ticket-mcp-server
flight-ticket-mcp-server
```

**uvx 的优势:**
- 🚀 无需污染全局Python环境
- 📦 自动管理虚拟环境
- 🔄 支持直接运行最新版本
- 🛡️ 隔离依赖,避免冲突

## 启动方式

### 1. 直接启动(默认SSE模式)

```bash
# 使用主启动文件(默认启动SSE模式,监听127.0.0.1:8000)
python flight_ticket_server.py

# 或者直接运行main.py
python main.py
```

### 2. 调试模式启动

```bash
# 启用调试模式,会输出详细日志
set MCP_DEBUG=true
python flight_ticket_server.py

# Linux/macOS
export MCP_DEBUG=true
python flight_ticket_server.py
```

### 3. 不同传输协议启动

#### SSE模式(默认)
```bash
# 直接启动,使用默认SSE配置(127.0.0.1:8000)
python flight_ticket_server.py
```

#### stdio模式
```bash
# Windows
set MCP_TRANSPORT=stdio
python flight_ticket_server.py

# Linux/macOS
export MCP_TRANSPORT=stdio
python flight_ticket_server.py
```

#### HTTP模式
```bash
# Windows
set MCP_TRANSPORT=streamable-http
set MCP_HOST=127.0.0.1
set MCP_PORT=8000
python flight_ticket_server.py

# Linux/macOS
export MCP_TRANSPORT=streamable-http
export MCP_HOST=127.0.0.1
export MCP_PORT=8000
python flight_ticket_server.py
```

### 4. 环境变量配置

#### 使用 .env 文件(推荐)

项目提供了 `.env.example` 文件作为配置模板:

1. **复制配置模板**:
   ```bash
   # 复制配置模板
   cp .env.example .env
   ```

2. **编辑配置文件**:
   打开 `.env` 文件,根据需要修改配置值:
   ```env
   # MCP服务器配置
   MCP_TRANSPORT=sse
   MCP_HOST=127.0.0.1
   MCP_PORT=8000
   MCP_SSE_PATH=/sse
   
   # 日志配置
   LOG_LEVEL=INFO
   LOG_FILE_PATH=logs/flight_server.log
   LOG_MAX_SIZE=10
   LOG_BACKUP_COUNT=5
   
   # 开发配置
   MCP_DEBUG=false
   ```

3. **配置说明**:
   - `.env` 文件包含敏感配置,不会被提交到版本控制
   - `.env.example` 是安全的模板文件,可以提交到Git
   - 环境变量优先级:系统环境变量 > .env文件 > 程序默认值

#### 直接设置环境变量

如果不使用 `.env` 文件,也可以直接设置环境变量:

支持的环境变量:

| 变量名 | 描述 | 默认值 | 可选值 |
|--------|------|--------|--------|
| `MCP_TRANSPORT` | 传输协议类型 | `sse` | `stdio`, `sse`, `streamable-http` |
| `MCP_HOST` | 服务器主机地址 | `127.0.0.1` | 任何有效IP地址 |
| `MCP_PORT` | 服务器端口 | `8000` | 1-65535 |
| `MCP_PATH` | HTTP路径 | `/mcp` | 任何有效路径 |
| `MCP_SSE_PATH` | SSE路径 | `/sse` | 任何有效路径 |
| `MCP_DEBUG` | 调试模式 | `false` | `true`, `false`, `1`, `0` |
| `LOG_LEVEL` | 日志级别 | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` |
| `LOG_FILE_PATH` | 日志文件路径 | `logs/flight_server.log` | 任何有效路径 |
| `LOG_MAX_SIZE` | 日志文件最大大小(MB) | `10` | 正整数 |
| `LOG_BACKUP_COUNT` | 日志备份数量 | `5` | 正整数 |
| `FASTMCP_LOG_LEVEL` | FastMCP日志级别 | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR` |

### 5. 启动验证

启动成功后,您会看到类似输出:

```
Transport: sse
Logging enabled - logs will be saved to logs/ directory
Flight Ticket MCP Server starting...
Transport: sse
All tools registered successfully
Starting SSE transport on 127.0.0.1:8000/sse
```

### 6. 日志文件

服务器启动后会在 `logs/` 目录下生成以下日志文件:

- `flight_server.log` - 一般日志(INFO级别及以上)
- `flight_server_error.log` - 错误日志(ERROR级别)
- `flight_server_debug.log` - 调试日志(仅在调试模式下生成)

### 7. 停止服务器

- **stdio模式**: 按 `Ctrl+C` 停止
- **HTTP/SSE模式**: 按 `Ctrl+C` 或发送SIGTERM信号

## 使用方法

### MCP客户端配置

#### 方式一:使用uvx(推荐)

使用uvx运行MCP服务器,无需预先安装,简洁优雅:

```json
{
  "mcpServers": {
    "flight-ticket-server": {
      "command": "uvx",
      "args": ["flight-ticket-mcp-server"]
    }
  }
}
```

**uvx配置的优势:**
- 🚀 无需预先安装包
- 📦 自动管理依赖和虚拟环境
- 🔄 始终运行最新版本
- 🛡️ 隔离环境,避免冲突

#### 方式二:使用pip安装后运行

如果已通过pip安装,可以直接使用命令行工具:

```json
{
  "mcpServers": {
    "flight-ticket-server": {
      "command": "flight-ticket-mcp-server"
    }
  }
}
```

#### 方式三:本地开发版本

对于本地开发或自定义版本:

```json
{
  "mcpServers": {
    "flight-ticket-server": {
      "command": "python",
      "args": ["D:\\FlightTicketMCP\\flight_ticket_server.py"],
      "env": {
        "MCP_TRANSPORT": "stdio"
      }
    }
  }
}
```

#### 配置文件位置

将上述配置添加到Claude Desktop配置文件中:
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**: `~/.config/claude/claude_desktop_config.json`

#### 应用配置

1. 保存配置文件
2. 重启Claude Desktop
3. 在Claude Desktop中应该能看到flight-ticket-server连接成功

### 不同传输协议的配置

#### SSE模式(默认)
```json
{
  "mcpServers": {
    "flight-ticket-server": {
      "command": "python",
      "args": ["D:\\FlightTicketMCPServer\\flight_ticket_server.py"],
      "env": {
        "MCP_TRANSPORT": "sse",
        "MCP_HOST": "127.0.0.1",
        "MCP_PORT": "8000",
        "MCP_SSE_PATH": "/sse"
      }
    }
  }
}
```

#### stdio模式
```json
{
  "mcpServers": {
    "flight-ticket-server": {
      "command": "python",
      "args": ["D:\\FlightTicketMCPServer\\flight_ticket_server.py"],
      "env": {
        "MCP_TRANSPORT": "stdio"
      }
    }
  }
}
```

#### HTTP模式
```json
{
  "mcpServers": {
    "flight-ticket-server": {
      "command": "python",
      "args": ["D:\\FlightTicketMCPServer\\flight_ticket_server.py"],
      "env": {
        "MCP_TRANSPORT": "streamable-http",
        "MCP_HOST": "127.0.0.1",
        "MCP_PORT": "8000",
        "MCP_PATH": "/mcp"
      }
    }
  }
}
```

### MCP客户端测试

#### 测试连接

配置完成后,可以通过以下方式测试MCP服务器连接:

1. **Claude Desktop测试**:
   - 重启Claude Desktop
   - 检查状态栏是否显示"flight-ticket-server"连接成功
   - 在对话中尝试询问:"你现在有哪些工具可用?"

2. **命令行测试**:
   ```bash
   # 使用uvx直接测试
   uvx flight-ticket-mcp-server --help
   
   # 或使用已安装的包测试
   flight-ticket-mcp-server --help
   
   # 测试模块化运行
   python -m flight_ticket_mcp_server --help
   ```

3. **MCP协议测试**:
   ```bash
   # 使用MCP inspector工具测试(如果安装了)
   npx @modelcontextprotocol/inspector uvx flight-ticket-mcp-server
   ```

#### 验证工具注册

成功连接后,您的Claude应该能够访问以下工具:

- ✈️ **searchFlightRoutes** - 航班路线查询
- 📅 **getCurrentDate** - 获取当前日期  
- 🔄 **getTransferFlightsByThreePlace** - 航班中转查询
- 🌤️ **getWeatherByLocation** - 经纬度天气查询
- 🏙️ **getWeatherByCity** - 城市天气查询
- ℹ️ **getFlightInfo** - 航班信息查询
- 📡 **getFlightStatus** - 航班实时状态查询
- 🛫 **getAirportFlights** - 机场周边航班查询
- 🗺️ **getFlightsInArea** - 区域航班查询
- 📊 **trackMultipleFlights** - 批量航班跟踪

#### 故障排除

如果连接失败,请检查:

1. **uvx配置**:
   ```bash
   # 检查uvx是否安装
   uvx --version
   
   # 手动测试包运行
   uvx flight-ticket-mcp-server
   ```

2. **包版本**:
   ```bash
   # 强制使用最新版本
   uvx --force flight-ticket-mcp-server
   ```

3. **配置文件语法**:
   - 确保JSON格式正确
   - 检查引号和括号匹配
   - 验证配置文件路径

4. **日志检查**:
   - 查看Claude Desktop的日志输出
   - 检查服务器启动日志

### 示例操作

配置完成后,您可以要求Claude执行以下操作:

#### 航班路线查询
- "查询重庆到广州明天的航班"
- "搜索上海到北京后天的所有航班"
- "查看深圳飞成都2024年7月20日的航班价格"
- "北京到三亚的航班有哪些选择"
- "帮我找一下成都到杭州下周二的航班信息"

#### 航班中转查询
- "查询北京经香港到纽约的中转航班"
- "搜索上海经迪拜到伦敦的联程航班,中转时间3-6小时"
- "查找广州经新加坡到悉尼的航班,最短中转2小时"
- "北京到洛杉矶,经东京中转的航班有哪些"

#### 天气信息查询
- "查询北京今天和明天的天气情况"
- "上海的天气怎么样"
- "查询纬度39.9042,经度116.4074的天气"(北京坐标)
- "武汉本周的天气预报"
- "查询重庆2024年7月15日到7月17日的天气"

#### 航班信息查询
- "查询航班CA1234的详细信息"
- "MU5678这个航班现在什么状态"
- "帮我查看航班HU7890的座位和价格信息"
- "CZ3691航班的登机口和航站楼信息"

#### 实时航班跟踪查询
- "查询航班CCA1234的实时状态和位置"
- "查看北京首都机场周边有哪些航班"
- "查询北京地区(纬度39-41,经度115-118)内的所有航班"
- "同时跟踪航班CCA1234、CSN5678、MU9876的实时状态"
- "查看浦东机场附近正在飞行的航班"
- "这架飞机现在在哪里?飞行高度和速度是多少?"

#### 日期时间查询
- "今天是几号"
- "现在的日期和时间是什么"
- "帮我获取当前日期"

#### 综合查询示例
- "我要从成都飞北京,明天出发,顺便告诉我北京的天气"
- "查询上海到广州的航班,还有广州的天气情况"
- "帮我规划从重庆到东京的行程,需要中转,并查看目的地天气"
- "查询CA1234航班信息,以及出发地和目的地的天气"
- "我的航班是MU5678,帮我查看航班状态和座位情况"
- "查询CCA1234航班的实时位置,同时告诉我目的地天气"
- "我想知道北京机场现在有哪些航班起飞,以及北京的天气状况"

## API参考

### 航班路线查询
```python
searchFlightRoutes(departure_city, destination_city, departure_date)  # 根据出发地、目的地和日期查询可用航班
```

输入参数:
- `departure_city`: 出发城市名称或机场代码 (如: "重庆", "CKG", "重庆(CKG)")
- `destination_city`: 目的地城市名称或机场代码 (如: "广州", "CAN", "广州(CAN)")
- `departure_date`: 出发日期 (YYYY-MM-DD格式)

输出信息:
- 航班列表(包含航班号、航空公司、起飞到达时间、机场、航站楼、价格)
- 价格统计(最低价、最高价、平均价)
- 航空公司分布统计
- 格式化的查询结果输出
- 支持的城市:282个国内城市和机场

支持的城市格式:
- 城市名:上海、北京、重庆、广州等
- 机场代码:SHA、BJS、CKG、CAN等
- 完整格式:上海(SHA)、北京(BJS)等

### 航班中转路线查询
```python
getTransferFlightsByThreePlace(from_place, transfer_place, to_place, min_transfer_time, max_transfer_time)
```

输入参数:
- `from_place`: 出发地城市名称或机场代码 (如: "北京", "BJS")
- `transfer_place`: 中转地城市名称或机场代码 (如: "香港", "HKG")  
- `to_place`: 目的地城市名称或机场代码 (如: "纽约", "NYC")
- `min_transfer_time`: 最小中转时间(小时),默认2.0小时
- `max_transfer_time`: 最大中转时间(小时),默认5.0小时

输出信息:
- 符合条件的中转航班组合列表
- 第一段航程详细信息(出发地到中转地)
- 第二段航程详细信息(中转地到目的地)
- 实际中转时间计算
- 航班号、时间、机场等详细信息

### 天气信息查询

#### 按经纬度查询
```python
getWeatherByLocation(latitude, longitude, start_date, end_date)
```

输入参数:
- `latitude`: 纬度 (如: 39.9042)
- `longitude`: 经度 (如: 116.4074)
- `start_date`: 开始日期 (YYYY-MM-DD格式),可选
- `end_date`: 结束日期 (YYYY-MM-DD格式),可选

#### 按城市名查询
```python
getWeatherByCity(city_name, start_date, end_date)
```

输入参数:
- `city_name`: 城市名称 (如: "北京", "上海", "武汉")
- `start_date`: 开始日期 (YYYY-MM-DD格式),可选
- `end_date`: 结束日期 (YYYY-MM-DD格式),可选

输出信息:
- 天气状况描述
- 温度信息(最高温、最低温、当前温度)
- 湿度、风速、风向
- 降水概率和降水量
- 日出日落时间
- 紫外线指数

### 航班信息查询
```python
getFlightInfo(flight_number)  # 根据航班号查询详细航班信息
```

输入参数:
- `flight_number`: 航班号 (如: "CA1234", "MU5678", "CZ3691")

输出信息:
- 航班基本信息(航空公司、机型、航线类型)
- 航线信息(出发和到达机场、航站楼、登机口)
- 实时状态(准时、延误、登机、飞行中、已到达等)
- 座位配置(经济舱、商务舱、头等舱座位数)
- 价格信息(各舱位价格和可用性)
- 天气信息(出发地和目的地当前天气)
- 附加服务(值机柜台、行李额度、餐食、WiFi等)

支持的航班号格式:
- 中国国际航空:CA1234、CA8901
- 中国东方航空:MU5678、MU2468
- 中国南方航空:CZ3691、CZ1357
- 海南航空:HU7890
- 厦门航空:MF8123
- 春秋航空:9C8765
- 吉祥航空:HO1288
- 国外航空:UA858、NH955 等

### 实时航班跟踪

#### 航班实时状态查询
```python
getFlightStatus(flight_number, date=None)  # 查询航班实时状态
```

输入参数:
- `flight_number`: 航班呼号 (如: "CCA1234", "CSN5678", "MU9876")
- `date`: 日期参数(OpenSky仅支持实时数据,此参数被忽略)

输出信息:
- 航班实时位置(经纬度、高度)
- 飞行速度(地面速度、垂直速度)
- 航班状态(飞行中、地面、滑行、静止)
- 航向角和高度信息
- 最后联系时间
- 起源国家信息

#### 机场周边航班查询
```python
getAirportFlights(airport_code, flight_type="departure")  # 查询机场周边航班
```

输入参数:
- `airport_code`: 机场代码 (如: "PEK", "PVG", "CAN", "CTU", "XIY")
- `flight_type`: 航班类型(此参数仅为兼容性,OpenSky返回所有航班)

输出信息:
- 机场周边30公里范围内的所有航班
- 每架航班的实时位置和状态
- 航班呼号、速度、高度信息
- 机场坐标和搜索范围

支持的机场代码(70+个):
- 北京:PEK(首都)、PKX(大兴)
- 上海:PVG(浦东)、SHA(虹桥)
- 广州:CAN、深圳:SZX、成都:CTU/TFU
- 重庆:CKG、西安:XIY、昆明:KMG
- 杭州:HGH、南京:NKG、武汉:WUH
- 以及其他主要城市机场

#### 区域航班查询
```python
getFlightsInArea(min_lat, max_lat, min_lon, max_lon)  # 查询指定区域内航班
```

输入参数:
- `min_lat`: 最小纬度 (如: 39.0)
- `max_lat`: 最大纬度 (如: 41.0)
- `min_lon`: 最小经度 (如: 115.0)
- `max_lon`: 最大经度 (如: 118.0)

输出信息:
- 指定地理区域内的所有实时航班
- 航班位置、速度、高度等详细信息
- 边界框坐标和查询范围

#### 批量航班跟踪
```python
trackMultipleFlights(flight_numbers, date=None)  # 批量跟踪多个航班
```

输入参数:
- `flight_numbers`: 航班呼号列表 (如: ["CCA1234", "CSN5678", "MU9876"])
- `date`: 日期参数(OpenSky仅支持实时数据)

输出信息:
- 多个航班的实时状态汇总
- 每个航班的详细查询结果
- 成功查询数量统计
- 批量查询执行时间

注意事项:
- OpenSky Network仅提供实时数据,不支持历史航班查询
- API有频率限制,批量查询时会自动添加延时
- 部分航班可能无呼号信息或位置数据不完整
- 数据精度和可用性取决于ADS-B信号覆盖

### 日期时间工具
```python
getCurrentDate()  # 获取当前日期(YYYY-MM-DD格式)
```

输出信息:
- 当前系统日期字符串

## 开发

### 项目结构
```
FlightTicketMCPServer/
├── flight_ticket_server/
│   ├── core/              # 核心业务逻辑
│   ├── tools/             # MCP工具实现
│   ├── utils/             # 实用工具函数
│   └── main.py            # 服务器入口点
├── office_flight_ticket_server/  # 额外模块
├── tests/                 # 测试文件
├── logs/                  # 日志文件目录
├── pyproject.toml         # 项目配置
├── requirements.txt       # 项目依赖
├── flight_ticket_server.py # 主启动文件
├── mcp-config.json        # MCP配置示例
└── README.md              # 项目文档
```

### 测试

```bash
# 运行所有测试
python -m pytest tests/ -v

# 运行基本功能测试
python -m pytest tests/test_basic.py -v

# 运行特定测试
python -m pytest tests/test_basic.py::TestFlightSearch::test_searchFlightsByNumber -v
```

### 日志和调试

- 日志文件位置:`logs/` 目录
- 启用调试模式:设置 `MCP_DEBUG=true`
- 查看实时日志:`tail -f logs/flight_server.log`

## 故障排除

### 常见问题

1. **端口被占用**
   ```bash
   # 更改端口
   set MCP_PORT=8001
   python flight_ticket_server.py
   ```

2. **导入错误**
   ```bash
   # 确保在正确的目录
   cd FlightTicketMCPServer/flight_ticket_server
   python flight_ticket_server.py
   ```

3. **权限问题**
   ```bash
   # 检查文件权限
   ls -la flight_ticket_server.py
   chmod +x flight_ticket_server.py
   ```

### 日志分析

查看日志文件了解详细错误信息:
```bash
# 查看一般日志
cat logs/flight_server.log

# 查看错误日志
cat logs/flight_server_error.log

# 实时监控日志
tail -f logs/flight_server.log
```

## 许可证

MIT License - 查看 [LICENSE](LICENSE) 文件获取详细信息。

## 贡献

欢迎提交Issue和Pull Request来改进这个项目。

## 支持

如果您遇到问题或有功能建议,请在GitHub上创建Issue。

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yourusername/flight-ticket-mcp-server",
    "name": "flight-ticket-mcp-server",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "mcp, flight, ticket, search, ai, fastmcp",
    "author": "Your Name",
    "author_email": "Your Name <your.email@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/70/da/6fcbe4a0b264a6b3e41be64853999ce723f636b70f93d3e007b41fe21cfe/flight_ticket_mcp_server-1.0.1.tar.gz",
    "platform": null,
    "description": "# Flight Ticket MCP Server\r\n\r\n\u4e00\u4e2a\u57fa\u4e8e\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae(MCP)\u7684\u822a\u7a7a\u673a\u7968\u67e5\u8be2\u670d\u52a1\u5668\u3002\u8be5\u670d\u52a1\u5668\u4e3aAI\u52a9\u624b\u63d0\u4f9b\u6807\u51c6\u5316\u7684\u822a\u73ed\u5b9e\u65f6\u52a8\u6001\u67e5\u8be2\u529f\u80fd\u63a5\u53e3\u3002\r\n\r\n## \u6982\u8ff0\r\n\r\nFlight Ticket MCP Server \u5b9e\u73b0\u4e86\u4f9b\u822a\u7a7a\u673a\u7968\u76f8\u5173\u67e5\u8be2\u64cd\u4f5c\u7684\u5de5\u5177\u548c\u8d44\u6e90\u3002\u5b83\u4f5c\u4e3aAI\u52a9\u624b\u4e0e\u822a\u7a7a\u670d\u52a1\u7cfb\u7edf\u4e4b\u95f4\u7684\u6865\u6881\uff0c\u4e13\u6ce8\u4e8e\u822a\u73ed\u5b9e\u65f6\u52a8\u6001\u67e5\u8be2\u529f\u80fd\u3002\r\n\r\n\u8be5\u670d\u52a1\u5668\u91c7\u7528\u6a21\u5757\u5316\u67b6\u6784\uff0c\u5c06\u6838\u5fc3\u529f\u80fd\u3001\u5de5\u5177\u548c\u5b9e\u7528\u7a0b\u5e8f\u5206\u79bb\uff0c\u4f7f\u5176\u5177\u6709\u9ad8\u5ea6\u7684\u53ef\u7ef4\u62a4\u6027\u548c\u53ef\u6269\u5c55\u6027\u3002\r\n\r\n## \u529f\u80fd\u7279\u6027\r\n\r\n### \u822a\u73ed\u8def\u7ebf\u67e5\u8be2\r\n- \u6839\u636e\u51fa\u53d1\u5730\u3001\u76ee\u7684\u5730\u548c\u51fa\u53d1\u65e5\u671f\u67e5\u8be2\u53ef\u7528\u822a\u73ed\r\n- \u652f\u6301282\u4e2a\u56fd\u5185\u57ce\u5e02\u548c\u673a\u573a\u4ee3\u7801\r\n- \u667a\u80fd\u57ce\u5e02\u540d\u79f0\u89e3\u6790\uff08\u652f\u6301\u57ce\u5e02\u540d\u3001\u673a\u573a\u4ee3\u7801\u3001\u5b8c\u6574\u683c\u5f0f\uff09\r\n- \u5b9e\u65f6\u822a\u73ed\u4ef7\u683c\u548c\u822a\u73ed\u65f6\u523b\u4fe1\u606f\r\n- \u822a\u7a7a\u516c\u53f8\u548c\u673a\u578b\u4fe1\u606f\r\n- \u822a\u7ad9\u697c\u548c\u767b\u673a\u53e3\u4fe1\u606f\r\n- \u4ef7\u683c\u7edf\u8ba1\u548c\u822a\u7a7a\u516c\u53f8\u5206\u5e03\r\n- \u683c\u5f0f\u5316\u8f93\u51fa\u7ed3\u679c\r\n\r\n### \u822a\u73ed\u4e2d\u8f6c\u8def\u7ebf\u67e5\u8be2\r\n- \u6839\u636e\u51fa\u53d1\u5730\u3001\u4e2d\u8f6c\u5730\u3001\u76ee\u7684\u5730\u67e5\u8be2\u8054\u7a0b\u822a\u73ed\r\n- \u652f\u6301\u81ea\u5b9a\u4e49\u6700\u5c0f\u548c\u6700\u5927\u4e2d\u8f6c\u65f6\u95f4\uff08\u9ed8\u8ba42-5\u5c0f\u65f6\uff09\r\n- \u667a\u80fd\u7b5b\u9009\u7b26\u5408\u4e2d\u8f6c\u65f6\u95f4\u8981\u6c42\u7684\u822a\u73ed\u7ec4\u5408\r\n- \u63d0\u4f9b\u5b8c\u6574\u7684\u4e24\u6bb5\u822a\u7a0b\u4fe1\u606f\r\n- \u652f\u6301\u56fd\u5185\u5916\u822a\u7ebf\u4e2d\u8f6c\u67e5\u8be2\r\n- \u8be6\u7ec6\u7684\u4e2d\u8f6c\u65f6\u95f4\u8ba1\u7b97\u548c\u9a8c\u8bc1\r\n\r\n### \u5929\u6c14\u4fe1\u606f\u67e5\u8be2\r\n- **\u6309\u7ecf\u7eac\u5ea6\u67e5\u8be2**\uff1a\u7cbe\u786e\u5730\u7406\u4f4d\u7f6e\u5929\u6c14\u67e5\u8be2\r\n- **\u6309\u57ce\u5e02\u540d\u67e5\u8be2**\uff1a\u652f\u6301\u4e3b\u8981\u57ce\u5e02\u76f4\u63a5\u67e5\u8be2\r\n- \u652f\u6301\u5386\u53f2\u3001\u5f53\u524d\u548c\u672a\u6765\u5929\u6c14\u6570\u636e\r\n- \u63d0\u4f9b\u6e29\u5ea6\u3001\u6e7f\u5ea6\u3001\u98ce\u901f\u3001\u5929\u6c14\u72b6\u51b5\u7b49\u8be6\u7ec6\u4fe1\u606f\r\n- \u81ea\u52a8\u5904\u7406\u65f6\u533a\u548c\u65e5\u671f\u8303\u56f4\r\n- \u652f\u6301\u6b66\u6c49\u3001\u5317\u4eac\u3001\u4e0a\u6d77\u7b49\u4e3b\u8981\u57ce\u5e02\u9884\u8bbe\r\n\r\n### \u822a\u73ed\u4fe1\u606f\u67e5\u8be2\r\n- \u6839\u636e\u822a\u73ed\u53f7\u67e5\u8be2\u8be6\u7ec6\u7684\u822a\u73ed\u4fe1\u606f\r\n- \u5305\u542b\u822a\u73ed\u72b6\u6001\u3001\u5ea7\u4f4d\u914d\u7f6e\u3001\u4ef7\u683c\u4fe1\u606f\r\n- \u63d0\u4f9b\u5929\u6c14\u4fe1\u606f\uff08\u51fa\u53d1\u5730\u548c\u76ee\u7684\u5730\uff09\r\n- \u663e\u793a\u822a\u73ed\u57fa\u672c\u4fe1\u606f\uff08\u822a\u7a7a\u516c\u53f8\u3001\u673a\u578b\u3001\u822a\u7ebf\u7c7b\u578b\uff09\r\n- \u8be6\u7ec6\u7684\u822a\u7ad9\u697c\u3001\u767b\u673a\u53e3\u4fe1\u606f\r\n- \u5b9e\u65f6\u52a8\u6001\u72b6\u6001\uff08\u51c6\u65f6\u3001\u5ef6\u8bef\u3001\u767b\u673a\u3001\u98de\u884c\u4e2d\u7b49\uff09\r\n- \u5ea7\u4f4d\u4ef7\u683c\u548c\u53ef\u7528\u6027\u4fe1\u606f\r\n- \u9644\u52a0\u670d\u52a1\u4fe1\u606f\uff08\u9910\u98df\u3001WiFi\u3001\u5a31\u4e50\u7cfb\u7edf\u7b49\uff09\r\n\r\n### \u5b9e\u65f6\u822a\u73ed\u8ddf\u8e2a\r\n- **\u822a\u73ed\u5b9e\u65f6\u72b6\u6001\u67e5\u8be2**\uff1a\u67e5\u8be2\u822a\u73ed\u5b9e\u65f6\u4f4d\u7f6e\u548c\u72b6\u6001\r\n- **\u673a\u573a\u5468\u8fb9\u822a\u73ed\u67e5\u8be2**\uff1a\u67e5\u8be2\u6307\u5b9a\u673a\u573a\u5468\u8fb930\u516c\u91cc\u8303\u56f4\u5185\u7684\u6240\u6709\u822a\u73ed\r\n- **\u533a\u57df\u822a\u73ed\u67e5\u8be2**\uff1a\u67e5\u8be2\u6307\u5b9a\u5730\u7406\u533a\u57df\u5185\u7684\u6240\u6709\u5b9e\u65f6\u822a\u73ed\r\n- **\u6279\u91cf\u822a\u73ed\u8ddf\u8e2a**\uff1a\u540c\u65f6\u8ddf\u8e2a\u591a\u4e2a\u822a\u73ed\u7684\u5b9e\u65f6\u72b6\u6001\r\n- \u652f\u6301\u4e2d\u56fd\u4e3b\u8981\u673a\u573a\u4ee3\u7801\uff08PEK\u3001PVG\u3001CAN\u7b4970+\u673a\u573a\uff09\r\n- \u63d0\u4f9b\u8be6\u7ec6\u7684\u822a\u73ed\u4f4d\u7f6e\u3001\u901f\u5ea6\u3001\u9ad8\u5ea6\u3001\u72b6\u6001\u4fe1\u606f\r\n- \u65e0\u9700\u8ba4\u8bc1\u7684\u516c\u5f00API\uff0c\u5b9e\u65f6\u66f4\u65b0\u822a\u73ed\u6570\u636e\r\n\r\n### \u65e5\u671f\u65f6\u95f4\u5de5\u5177  \r\n- \u83b7\u53d6\u5f53\u524d\u7cfb\u7edf\u65e5\u671f\uff08YYYY-MM-DD\u683c\u5f0f\uff09\r\n- \u83b7\u53d6\u5f53\u524d\u7cfb\u7edf\u65e5\u671f\u65f6\u95f4\uff08YYYY-MM-DD HH:mm:ss\u683c\u5f0f\uff09\r\n- \u4e3a\u5176\u4ed6\u529f\u80fd\u63d0\u4f9b\u6807\u51c6\u5316\u7684\u65e5\u671f\u65f6\u95f4\u652f\u6301\r\n- \u81ea\u52a8\u5904\u7406\u65f6\u533a\u548c\u683c\u5f0f\u8f6c\u6362\r\n\r\n### \u6570\u636e\u5904\u7406\u4e0e\u667a\u80fd\u5316\r\n- **\u667a\u80fd\u57ce\u5e02\u89e3\u6790**\uff1a\u652f\u6301\u591a\u79cd\u57ce\u5e02\u8f93\u5165\u683c\u5f0f\uff08\u57ce\u5e02\u540d\u3001\u673a\u573a\u4ee3\u7801\u3001\u5b8c\u6574\u683c\u5f0f\uff09\r\n- **\u53c2\u6570\u9a8c\u8bc1**\uff1a\u5168\u9762\u7684\u8f93\u5165\u53c2\u6570\u9a8c\u8bc1\u548c\u9519\u8bef\u5904\u7406\r\n- **\u7ed3\u679c\u683c\u5f0f\u5316**\uff1a\u7edf\u4e00\u7684JSON\u683c\u5f0f\u8f93\u51fa\uff0c\u4fbf\u4e8eAI\u52a9\u624b\u89e3\u6790\r\n- **\u9519\u8bef\u6062\u590d**\uff1a\u5b8c\u5584\u7684\u5f02\u5e38\u5904\u7406\u548c\u964d\u7ea7\u673a\u5236\r\n- **\u65e5\u5fd7\u8bb0\u5f55**\uff1a\u8be6\u7ec6\u7684\u64cd\u4f5c\u65e5\u5fd7\u548c\u8c03\u8bd5\u4fe1\u606f\r\n\r\n## \u6280\u672f\u67b6\u6784\r\n\r\n### \u6838\u5fc3\u6a21\u5757 (Core)\r\n- \u822a\u73ed\u6570\u636e\u6a21\u578b\u548c\u7ed3\u6784\u5b9a\u4e49\r\n- \u673a\u573a\u3001\u822a\u7a7a\u516c\u53f8\u3001\u822a\u73ed\u3001\u4ef7\u683c\u7b49\u6570\u636e\u6a21\u578b\r\n- \u822a\u73ed\u4e2d\u8f6c\u548c\u5ea7\u4f4d\u914d\u7f6e\u6570\u636e\u7ed3\u6784\r\n\r\n### \u5de5\u5177\u6a21\u5757 (Tools)\r\n- **\u822a\u73ed\u641c\u7d22\u5de5\u5177** (`flight_search_tools.py`) - \u822a\u73ed\u8def\u7ebf\u67e5\u8be2\u529f\u80fd\r\n- **\u822a\u73ed\u4e2d\u8f6c\u5de5\u5177** (`flight_transfer_tools.py`) - \u591a\u6bb5\u822a\u7a0b\u548c\u4e2d\u8f6c\u67e5\u8be2  \r\n- **\u822a\u73ed\u4fe1\u606f\u5de5\u5177** (`flight_info_tools.py`) - \u6839\u636e\u822a\u73ed\u53f7\u67e5\u8be2\u8be6\u7ec6\u4fe1\u606f\r\n- **\u5b9e\u65f6\u822a\u73ed\u8ddf\u8e2a\u5de5\u5177** (`simple_opensky_tools.py`) - \u57fa\u4e8eOpenSky Network\u7684\u5b9e\u65f6\u822a\u73ed\u8ddf\u8e2a\r\n- **\u5929\u6c14\u67e5\u8be2\u5de5\u5177** (`weather_tools.py`) - \u57fa\u4e8e\u7ecf\u7eac\u5ea6\u548c\u57ce\u5e02\u7684\u5929\u6c14\u67e5\u8be2\r\n- **\u65e5\u671f\u65f6\u95f4\u5de5\u5177** (`date_tools.py`) - \u65e5\u671f\u65f6\u95f4\u83b7\u53d6\u548c\u5904\u7406\r\n\r\n### \u5b9e\u7528\u5de5\u5177 (Utils)\r\n- **\u57ce\u5e02\u5b57\u5178** (`cities_dict.py`) - 282\u4e2a\u57ce\u5e02\u548c\u673a\u573a\u4ee3\u7801\u6620\u5c04\r\n- **\u6570\u636e\u9a8c\u8bc1\u5668** (`validators.py`) - \u8f93\u5165\u53c2\u6570\u9a8c\u8bc1\u548c\u683c\u5f0f\u68c0\u67e5\r\n- **\u65e5\u671f\u5de5\u5177** (`date_utils.py`) - \u65e5\u671f\u683c\u5f0f\u5316\u548c\u65f6\u533a\u5904\u7406\r\n- **API\u5ba2\u6237\u7aef** (`api_client.py`) - HTTP\u8bf7\u6c42\u5c01\u88c5\u548c\u9519\u8bef\u5904\u7406\r\n\r\n### MCP\u96c6\u6210\u5c42\r\n- **FastMCP\u670d\u52a1\u5668** - \u57fa\u4e8eFastMCP\u6846\u67b6\u7684MCP\u534f\u8bae\u5b9e\u73b0\r\n- **\u591a\u4f20\u8f93\u534f\u8bae\u652f\u6301** - stdio\u3001SSE\u3001HTTP\u4f20\u8f93\u534f\u8bae\r\n- **\u5de5\u5177\u6ce8\u518c\u7ba1\u7406** - \u7edf\u4e00\u7684\u5de5\u5177\u6ce8\u518c\u548c\u8c03\u7528\u673a\u5236\r\n- **\u73af\u5883\u914d\u7f6e\u7ba1\u7406** - \u7075\u6d3b\u7684\u914d\u7f6e\u548c\u73af\u5883\u53d8\u91cf\u652f\u6301\r\n\r\n## \u652f\u6301\u7684\u4f20\u8f93\u534f\u8bae\r\n\r\n\u672c\u670d\u52a1\u5668\u652f\u6301\u4e09\u79cd\u4f20\u8f93\u534f\u8bae\uff1a\r\n\r\n1. **sse** - Server-Sent Events\uff08\u9ed8\u8ba4\uff0c\u9002\u7528\u4e8eWeb\u5e94\u7528\uff09\r\n2. **stdio** - \u6807\u51c6\u8f93\u5165\u8f93\u51fa\uff08\u9002\u7528\u4e8eClaude Desktop\uff09\r\n3. **streamable-http** - \u53ef\u6d41\u5f0fHTTP\uff08\u9002\u7528\u4e8eHTTP\u5ba2\u6237\u7aef\uff09\r\n\r\n## \u5b89\u88c5\r\n\r\n### \u524d\u7f6e\u8981\u6c42\r\n- Python 3.11 \u6216\u66f4\u9ad8\u7248\u672c\r\n- pip \u5305\u7ba1\u7406\u5668\uff08\u6216 uvx \u5de5\u5177\uff09\r\n\r\n### \u65b9\u5f0f\u4e00\uff1a\u4ecePyPI\u5b89\u88c5\uff08\u63a8\u8350\uff09\r\n\r\n```bash\r\n# \u4f7f\u7528pip\u5b89\u88c5\r\npip install flight-ticket-mcp-server\r\n\r\n# \u6216\u4f7f\u7528uvx\u76f4\u63a5\u8fd0\u884c\uff08\u65e0\u9700\u5b89\u88c5\uff09\r\nuvx flight-ticket-mcp-server\r\n\r\n# \u6216\u4f7f\u7528uvx\u5b89\u88c5\u540e\u8fd0\u884c\r\nuvx --install flight-ticket-mcp-server\r\n```\r\n\r\n### \u65b9\u5f0f\u4e8c\uff1a\u672c\u5730\u5f00\u53d1\u5b89\u88c5\r\n```bash\r\n# \u514b\u9686\u6216\u4e0b\u8f7d\u9879\u76ee\r\ncd FlightTicketMCP\r\n\r\n# \u5b89\u88c5\u4f9d\u8d56\r\npip install -r requirements.txt\r\n\r\n# \u6216\u4ece\u672c\u5730\u6e90\u7801\u5b89\u88c5\r\npip install -e .\r\n```\r\n\r\n### uvx \u4f7f\u7528\u8bf4\u660e\r\n\r\nuvx \u662f\u4e00\u4e2a\u73b0\u4ee3\u7684Python\u5305\u8fd0\u884c\u5de5\u5177\uff0c\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884cPyPI\u5305\u800c\u65e0\u9700\u5148\u5b89\u88c5\u5230\u7cfb\u7edf\u73af\u5883\uff1a\r\n\r\n```bash\r\n# \u5b89\u88c5uvx\uff08\u5982\u679c\u8fd8\u6ca1\u6709\u5b89\u88c5\uff09\r\npip install uvx\r\n\r\n# \u76f4\u63a5\u8fd0\u884cMCP\u670d\u52a1\u5668\uff08\u65e0\u9700\u5b89\u88c5\uff09\r\nuvx flight-ticket-mcp-server\r\n\r\n# \u5e26\u53c2\u6570\u8fd0\u884c\r\nuvx flight-ticket-mcp-server --help\r\n\r\n# \u6307\u5b9a\u7248\u672c\u8fd0\u884c\r\nuvx flight-ticket-mcp-server==1.0.0\r\n\r\n# \u5b89\u88c5\u5230uvx\u73af\u5883\u540e\u8fd0\u884c\r\nuvx --install flight-ticket-mcp-server\r\nflight-ticket-mcp-server\r\n```\r\n\r\n**uvx \u7684\u4f18\u52bf\uff1a**\r\n- \ud83d\ude80 \u65e0\u9700\u6c61\u67d3\u5168\u5c40Python\u73af\u5883\r\n- \ud83d\udce6 \u81ea\u52a8\u7ba1\u7406\u865a\u62df\u73af\u5883\r\n- \ud83d\udd04 \u652f\u6301\u76f4\u63a5\u8fd0\u884c\u6700\u65b0\u7248\u672c\r\n- \ud83d\udee1\ufe0f \u9694\u79bb\u4f9d\u8d56\uff0c\u907f\u514d\u51b2\u7a81\r\n\r\n## \u542f\u52a8\u65b9\u5f0f\r\n\r\n### 1. \u76f4\u63a5\u542f\u52a8\uff08\u9ed8\u8ba4SSE\u6a21\u5f0f\uff09\r\n\r\n```bash\r\n# \u4f7f\u7528\u4e3b\u542f\u52a8\u6587\u4ef6\uff08\u9ed8\u8ba4\u542f\u52a8SSE\u6a21\u5f0f\uff0c\u76d1\u542c127.0.0.1:8000\uff09\r\npython flight_ticket_server.py\r\n\r\n# \u6216\u8005\u76f4\u63a5\u8fd0\u884cmain.py\r\npython main.py\r\n```\r\n\r\n### 2. \u8c03\u8bd5\u6a21\u5f0f\u542f\u52a8\r\n\r\n```bash\r\n# \u542f\u7528\u8c03\u8bd5\u6a21\u5f0f\uff0c\u4f1a\u8f93\u51fa\u8be6\u7ec6\u65e5\u5fd7\r\nset MCP_DEBUG=true\r\npython flight_ticket_server.py\r\n\r\n# Linux/macOS\r\nexport MCP_DEBUG=true\r\npython flight_ticket_server.py\r\n```\r\n\r\n### 3. \u4e0d\u540c\u4f20\u8f93\u534f\u8bae\u542f\u52a8\r\n\r\n#### SSE\u6a21\u5f0f\uff08\u9ed8\u8ba4\uff09\r\n```bash\r\n# \u76f4\u63a5\u542f\u52a8\uff0c\u4f7f\u7528\u9ed8\u8ba4SSE\u914d\u7f6e\uff08127.0.0.1:8000\uff09\r\npython flight_ticket_server.py\r\n```\r\n\r\n#### stdio\u6a21\u5f0f\r\n```bash\r\n# Windows\r\nset MCP_TRANSPORT=stdio\r\npython flight_ticket_server.py\r\n\r\n# Linux/macOS\r\nexport MCP_TRANSPORT=stdio\r\npython flight_ticket_server.py\r\n```\r\n\r\n#### HTTP\u6a21\u5f0f\r\n```bash\r\n# Windows\r\nset MCP_TRANSPORT=streamable-http\r\nset MCP_HOST=127.0.0.1\r\nset MCP_PORT=8000\r\npython flight_ticket_server.py\r\n\r\n# Linux/macOS\r\nexport MCP_TRANSPORT=streamable-http\r\nexport MCP_HOST=127.0.0.1\r\nexport MCP_PORT=8000\r\npython flight_ticket_server.py\r\n```\r\n\r\n### 4. \u73af\u5883\u53d8\u91cf\u914d\u7f6e\r\n\r\n#### \u4f7f\u7528 .env \u6587\u4ef6\uff08\u63a8\u8350\uff09\r\n\r\n\u9879\u76ee\u63d0\u4f9b\u4e86 `.env.example` \u6587\u4ef6\u4f5c\u4e3a\u914d\u7f6e\u6a21\u677f\uff1a\r\n\r\n1. **\u590d\u5236\u914d\u7f6e\u6a21\u677f**\uff1a\r\n   ```bash\r\n   # \u590d\u5236\u914d\u7f6e\u6a21\u677f\r\n   cp .env.example .env\r\n   ```\r\n\r\n2. **\u7f16\u8f91\u914d\u7f6e\u6587\u4ef6**\uff1a\r\n   \u6253\u5f00 `.env` \u6587\u4ef6\uff0c\u6839\u636e\u9700\u8981\u4fee\u6539\u914d\u7f6e\u503c\uff1a\r\n   ```env\r\n   # MCP\u670d\u52a1\u5668\u914d\u7f6e\r\n   MCP_TRANSPORT=sse\r\n   MCP_HOST=127.0.0.1\r\n   MCP_PORT=8000\r\n   MCP_SSE_PATH=/sse\r\n   \r\n   # \u65e5\u5fd7\u914d\u7f6e\r\n   LOG_LEVEL=INFO\r\n   LOG_FILE_PATH=logs/flight_server.log\r\n   LOG_MAX_SIZE=10\r\n   LOG_BACKUP_COUNT=5\r\n   \r\n   # \u5f00\u53d1\u914d\u7f6e\r\n   MCP_DEBUG=false\r\n   ```\r\n\r\n3. **\u914d\u7f6e\u8bf4\u660e**\uff1a\r\n   - `.env` \u6587\u4ef6\u5305\u542b\u654f\u611f\u914d\u7f6e\uff0c\u4e0d\u4f1a\u88ab\u63d0\u4ea4\u5230\u7248\u672c\u63a7\u5236\r\n   - `.env.example` \u662f\u5b89\u5168\u7684\u6a21\u677f\u6587\u4ef6\uff0c\u53ef\u4ee5\u63d0\u4ea4\u5230Git\r\n   - \u73af\u5883\u53d8\u91cf\u4f18\u5148\u7ea7\uff1a\u7cfb\u7edf\u73af\u5883\u53d8\u91cf > .env\u6587\u4ef6 > \u7a0b\u5e8f\u9ed8\u8ba4\u503c\r\n\r\n#### \u76f4\u63a5\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\r\n\r\n\u5982\u679c\u4e0d\u4f7f\u7528 `.env` \u6587\u4ef6\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff1a\r\n\r\n\u652f\u6301\u7684\u73af\u5883\u53d8\u91cf\uff1a\r\n\r\n| \u53d8\u91cf\u540d | \u63cf\u8ff0 | \u9ed8\u8ba4\u503c | \u53ef\u9009\u503c |\r\n|--------|------|--------|--------|\r\n| `MCP_TRANSPORT` | \u4f20\u8f93\u534f\u8bae\u7c7b\u578b | `sse` | `stdio`, `sse`, `streamable-http` |\r\n| `MCP_HOST` | \u670d\u52a1\u5668\u4e3b\u673a\u5730\u5740 | `127.0.0.1` | \u4efb\u4f55\u6709\u6548IP\u5730\u5740 |\r\n| `MCP_PORT` | \u670d\u52a1\u5668\u7aef\u53e3 | `8000` | 1-65535 |\r\n| `MCP_PATH` | HTTP\u8def\u5f84 | `/mcp` | \u4efb\u4f55\u6709\u6548\u8def\u5f84 |\r\n| `MCP_SSE_PATH` | SSE\u8def\u5f84 | `/sse` | \u4efb\u4f55\u6709\u6548\u8def\u5f84 |\r\n| `MCP_DEBUG` | \u8c03\u8bd5\u6a21\u5f0f | `false` | `true`, `false`, `1`, `0` |\r\n| `LOG_LEVEL` | \u65e5\u5fd7\u7ea7\u522b | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` |\r\n| `LOG_FILE_PATH` | \u65e5\u5fd7\u6587\u4ef6\u8def\u5f84 | `logs/flight_server.log` | \u4efb\u4f55\u6709\u6548\u8def\u5f84 |\r\n| `LOG_MAX_SIZE` | \u65e5\u5fd7\u6587\u4ef6\u6700\u5927\u5927\u5c0f(MB) | `10` | \u6b63\u6574\u6570 |\r\n| `LOG_BACKUP_COUNT` | \u65e5\u5fd7\u5907\u4efd\u6570\u91cf | `5` | \u6b63\u6574\u6570 |\r\n| `FASTMCP_LOG_LEVEL` | FastMCP\u65e5\u5fd7\u7ea7\u522b | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR` |\r\n\r\n### 5. \u542f\u52a8\u9a8c\u8bc1\r\n\r\n\u542f\u52a8\u6210\u529f\u540e\uff0c\u60a8\u4f1a\u770b\u5230\u7c7b\u4f3c\u8f93\u51fa\uff1a\r\n\r\n```\r\nTransport: sse\r\nLogging enabled - logs will be saved to logs/ directory\r\nFlight Ticket MCP Server starting...\r\nTransport: sse\r\nAll tools registered successfully\r\nStarting SSE transport on 127.0.0.1:8000/sse\r\n```\r\n\r\n### 6. \u65e5\u5fd7\u6587\u4ef6\r\n\r\n\u670d\u52a1\u5668\u542f\u52a8\u540e\u4f1a\u5728 `logs/` \u76ee\u5f55\u4e0b\u751f\u6210\u4ee5\u4e0b\u65e5\u5fd7\u6587\u4ef6\uff1a\r\n\r\n- `flight_server.log` - \u4e00\u822c\u65e5\u5fd7\uff08INFO\u7ea7\u522b\u53ca\u4ee5\u4e0a\uff09\r\n- `flight_server_error.log` - \u9519\u8bef\u65e5\u5fd7\uff08ERROR\u7ea7\u522b\uff09\r\n- `flight_server_debug.log` - \u8c03\u8bd5\u65e5\u5fd7\uff08\u4ec5\u5728\u8c03\u8bd5\u6a21\u5f0f\u4e0b\u751f\u6210\uff09\r\n\r\n### 7. \u505c\u6b62\u670d\u52a1\u5668\r\n\r\n- **stdio\u6a21\u5f0f**: \u6309 `Ctrl+C` \u505c\u6b62\r\n- **HTTP/SSE\u6a21\u5f0f**: \u6309 `Ctrl+C` \u6216\u53d1\u9001SIGTERM\u4fe1\u53f7\r\n\r\n## \u4f7f\u7528\u65b9\u6cd5\r\n\r\n### MCP\u5ba2\u6237\u7aef\u914d\u7f6e\r\n\r\n#### \u65b9\u5f0f\u4e00\uff1a\u4f7f\u7528uvx\uff08\u63a8\u8350\uff09\r\n\r\n\u4f7f\u7528uvx\u8fd0\u884cMCP\u670d\u52a1\u5668\uff0c\u65e0\u9700\u9884\u5148\u5b89\u88c5\uff0c\u7b80\u6d01\u4f18\u96c5\uff1a\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flight-ticket-server\": {\r\n      \"command\": \"uvx\",\r\n      \"args\": [\"flight-ticket-mcp-server\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n**uvx\u914d\u7f6e\u7684\u4f18\u52bf\uff1a**\r\n- \ud83d\ude80 \u65e0\u9700\u9884\u5148\u5b89\u88c5\u5305\r\n- \ud83d\udce6 \u81ea\u52a8\u7ba1\u7406\u4f9d\u8d56\u548c\u865a\u62df\u73af\u5883\r\n- \ud83d\udd04 \u59cb\u7ec8\u8fd0\u884c\u6700\u65b0\u7248\u672c\r\n- \ud83d\udee1\ufe0f \u9694\u79bb\u73af\u5883\uff0c\u907f\u514d\u51b2\u7a81\r\n\r\n#### \u65b9\u5f0f\u4e8c\uff1a\u4f7f\u7528pip\u5b89\u88c5\u540e\u8fd0\u884c\r\n\r\n\u5982\u679c\u5df2\u901a\u8fc7pip\u5b89\u88c5\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u547d\u4ee4\u884c\u5de5\u5177\uff1a\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flight-ticket-server\": {\r\n      \"command\": \"flight-ticket-mcp-server\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n#### \u65b9\u5f0f\u4e09\uff1a\u672c\u5730\u5f00\u53d1\u7248\u672c\r\n\r\n\u5bf9\u4e8e\u672c\u5730\u5f00\u53d1\u6216\u81ea\u5b9a\u4e49\u7248\u672c\uff1a\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flight-ticket-server\": {\r\n      \"command\": \"python\",\r\n      \"args\": [\"D:\\\\FlightTicketMCP\\\\flight_ticket_server.py\"],\r\n      \"env\": {\r\n        \"MCP_TRANSPORT\": \"stdio\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n#### \u914d\u7f6e\u6587\u4ef6\u4f4d\u7f6e\r\n\r\n\u5c06\u4e0a\u8ff0\u914d\u7f6e\u6dfb\u52a0\u5230Claude Desktop\u914d\u7f6e\u6587\u4ef6\u4e2d\uff1a\r\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\r\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\r\n- **Linux**: `~/.config/claude/claude_desktop_config.json`\r\n\r\n#### \u5e94\u7528\u914d\u7f6e\r\n\r\n1. \u4fdd\u5b58\u914d\u7f6e\u6587\u4ef6\r\n2. \u91cd\u542fClaude Desktop\r\n3. \u5728Claude Desktop\u4e2d\u5e94\u8be5\u80fd\u770b\u5230flight-ticket-server\u8fde\u63a5\u6210\u529f\r\n\r\n### \u4e0d\u540c\u4f20\u8f93\u534f\u8bae\u7684\u914d\u7f6e\r\n\r\n#### SSE\u6a21\u5f0f\uff08\u9ed8\u8ba4\uff09\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flight-ticket-server\": {\r\n      \"command\": \"python\",\r\n      \"args\": [\"D:\\\\FlightTicketMCPServer\\\\flight_ticket_server.py\"],\r\n      \"env\": {\r\n        \"MCP_TRANSPORT\": \"sse\",\r\n        \"MCP_HOST\": \"127.0.0.1\",\r\n        \"MCP_PORT\": \"8000\",\r\n        \"MCP_SSE_PATH\": \"/sse\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n#### stdio\u6a21\u5f0f\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flight-ticket-server\": {\r\n      \"command\": \"python\",\r\n      \"args\": [\"D:\\\\FlightTicketMCPServer\\\\flight_ticket_server.py\"],\r\n      \"env\": {\r\n        \"MCP_TRANSPORT\": \"stdio\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n#### HTTP\u6a21\u5f0f\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flight-ticket-server\": {\r\n      \"command\": \"python\",\r\n      \"args\": [\"D:\\\\FlightTicketMCPServer\\\\flight_ticket_server.py\"],\r\n      \"env\": {\r\n        \"MCP_TRANSPORT\": \"streamable-http\",\r\n        \"MCP_HOST\": \"127.0.0.1\",\r\n        \"MCP_PORT\": \"8000\",\r\n        \"MCP_PATH\": \"/mcp\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### MCP\u5ba2\u6237\u7aef\u6d4b\u8bd5\r\n\r\n#### \u6d4b\u8bd5\u8fde\u63a5\r\n\r\n\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u6d4b\u8bd5MCP\u670d\u52a1\u5668\u8fde\u63a5\uff1a\r\n\r\n1. **Claude Desktop\u6d4b\u8bd5**\uff1a\r\n   - \u91cd\u542fClaude Desktop\r\n   - \u68c0\u67e5\u72b6\u6001\u680f\u662f\u5426\u663e\u793a\"flight-ticket-server\"\u8fde\u63a5\u6210\u529f\r\n   - \u5728\u5bf9\u8bdd\u4e2d\u5c1d\u8bd5\u8be2\u95ee\uff1a\"\u4f60\u73b0\u5728\u6709\u54ea\u4e9b\u5de5\u5177\u53ef\u7528\uff1f\"\r\n\r\n2. **\u547d\u4ee4\u884c\u6d4b\u8bd5**\uff1a\r\n   ```bash\r\n   # \u4f7f\u7528uvx\u76f4\u63a5\u6d4b\u8bd5\r\n   uvx flight-ticket-mcp-server --help\r\n   \r\n   # \u6216\u4f7f\u7528\u5df2\u5b89\u88c5\u7684\u5305\u6d4b\u8bd5\r\n   flight-ticket-mcp-server --help\r\n   \r\n   # \u6d4b\u8bd5\u6a21\u5757\u5316\u8fd0\u884c\r\n   python -m flight_ticket_mcp_server --help\r\n   ```\r\n\r\n3. **MCP\u534f\u8bae\u6d4b\u8bd5**\uff1a\r\n   ```bash\r\n   # \u4f7f\u7528MCP inspector\u5de5\u5177\u6d4b\u8bd5\uff08\u5982\u679c\u5b89\u88c5\u4e86\uff09\r\n   npx @modelcontextprotocol/inspector uvx flight-ticket-mcp-server\r\n   ```\r\n\r\n#### \u9a8c\u8bc1\u5de5\u5177\u6ce8\u518c\r\n\r\n\u6210\u529f\u8fde\u63a5\u540e\uff0c\u60a8\u7684Claude\u5e94\u8be5\u80fd\u591f\u8bbf\u95ee\u4ee5\u4e0b\u5de5\u5177\uff1a\r\n\r\n- \u2708\ufe0f **searchFlightRoutes** - \u822a\u73ed\u8def\u7ebf\u67e5\u8be2\r\n- \ud83d\udcc5 **getCurrentDate** - \u83b7\u53d6\u5f53\u524d\u65e5\u671f  \r\n- \ud83d\udd04 **getTransferFlightsByThreePlace** - \u822a\u73ed\u4e2d\u8f6c\u67e5\u8be2\r\n- \ud83c\udf24\ufe0f **getWeatherByLocation** - \u7ecf\u7eac\u5ea6\u5929\u6c14\u67e5\u8be2\r\n- \ud83c\udfd9\ufe0f **getWeatherByCity** - \u57ce\u5e02\u5929\u6c14\u67e5\u8be2\r\n- \u2139\ufe0f **getFlightInfo** - \u822a\u73ed\u4fe1\u606f\u67e5\u8be2\r\n- \ud83d\udce1 **getFlightStatus** - \u822a\u73ed\u5b9e\u65f6\u72b6\u6001\u67e5\u8be2\r\n- \ud83d\udeeb **getAirportFlights** - \u673a\u573a\u5468\u8fb9\u822a\u73ed\u67e5\u8be2\r\n- \ud83d\uddfa\ufe0f **getFlightsInArea** - \u533a\u57df\u822a\u73ed\u67e5\u8be2\r\n- \ud83d\udcca **trackMultipleFlights** - \u6279\u91cf\u822a\u73ed\u8ddf\u8e2a\r\n\r\n#### \u6545\u969c\u6392\u9664\r\n\r\n\u5982\u679c\u8fde\u63a5\u5931\u8d25\uff0c\u8bf7\u68c0\u67e5\uff1a\r\n\r\n1. **uvx\u914d\u7f6e**\uff1a\r\n   ```bash\r\n   # \u68c0\u67e5uvx\u662f\u5426\u5b89\u88c5\r\n   uvx --version\r\n   \r\n   # \u624b\u52a8\u6d4b\u8bd5\u5305\u8fd0\u884c\r\n   uvx flight-ticket-mcp-server\r\n   ```\r\n\r\n2. **\u5305\u7248\u672c**\uff1a\r\n   ```bash\r\n   # \u5f3a\u5236\u4f7f\u7528\u6700\u65b0\u7248\u672c\r\n   uvx --force flight-ticket-mcp-server\r\n   ```\r\n\r\n3. **\u914d\u7f6e\u6587\u4ef6\u8bed\u6cd5**\uff1a\r\n   - \u786e\u4fddJSON\u683c\u5f0f\u6b63\u786e\r\n   - \u68c0\u67e5\u5f15\u53f7\u548c\u62ec\u53f7\u5339\u914d\r\n   - \u9a8c\u8bc1\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\r\n\r\n4. **\u65e5\u5fd7\u68c0\u67e5**\uff1a\r\n   - \u67e5\u770bClaude Desktop\u7684\u65e5\u5fd7\u8f93\u51fa\r\n   - \u68c0\u67e5\u670d\u52a1\u5668\u542f\u52a8\u65e5\u5fd7\r\n\r\n### \u793a\u4f8b\u64cd\u4f5c\r\n\r\n\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u60a8\u53ef\u4ee5\u8981\u6c42Claude\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a\r\n\r\n#### \u822a\u73ed\u8def\u7ebf\u67e5\u8be2\r\n- \"\u67e5\u8be2\u91cd\u5e86\u5230\u5e7f\u5dde\u660e\u5929\u7684\u822a\u73ed\"\r\n- \"\u641c\u7d22\u4e0a\u6d77\u5230\u5317\u4eac\u540e\u5929\u7684\u6240\u6709\u822a\u73ed\"\r\n- \"\u67e5\u770b\u6df1\u5733\u98de\u6210\u90fd2024\u5e747\u670820\u65e5\u7684\u822a\u73ed\u4ef7\u683c\"\r\n- \"\u5317\u4eac\u5230\u4e09\u4e9a\u7684\u822a\u73ed\u6709\u54ea\u4e9b\u9009\u62e9\"\r\n- \"\u5e2e\u6211\u627e\u4e00\u4e0b\u6210\u90fd\u5230\u676d\u5dde\u4e0b\u5468\u4e8c\u7684\u822a\u73ed\u4fe1\u606f\"\r\n\r\n#### \u822a\u73ed\u4e2d\u8f6c\u67e5\u8be2\r\n- \"\u67e5\u8be2\u5317\u4eac\u7ecf\u9999\u6e2f\u5230\u7ebd\u7ea6\u7684\u4e2d\u8f6c\u822a\u73ed\"\r\n- \"\u641c\u7d22\u4e0a\u6d77\u7ecf\u8fea\u62dc\u5230\u4f26\u6566\u7684\u8054\u7a0b\u822a\u73ed\uff0c\u4e2d\u8f6c\u65f6\u95f43-6\u5c0f\u65f6\"\r\n- \"\u67e5\u627e\u5e7f\u5dde\u7ecf\u65b0\u52a0\u5761\u5230\u6089\u5c3c\u7684\u822a\u73ed\uff0c\u6700\u77ed\u4e2d\u8f6c2\u5c0f\u65f6\"\r\n- \"\u5317\u4eac\u5230\u6d1b\u6749\u77f6\uff0c\u7ecf\u4e1c\u4eac\u4e2d\u8f6c\u7684\u822a\u73ed\u6709\u54ea\u4e9b\"\r\n\r\n#### \u5929\u6c14\u4fe1\u606f\u67e5\u8be2\r\n- \"\u67e5\u8be2\u5317\u4eac\u4eca\u5929\u548c\u660e\u5929\u7684\u5929\u6c14\u60c5\u51b5\"\r\n- \"\u4e0a\u6d77\u7684\u5929\u6c14\u600e\u4e48\u6837\"\r\n- \"\u67e5\u8be2\u7eac\u5ea639.9042\uff0c\u7ecf\u5ea6116.4074\u7684\u5929\u6c14\"\uff08\u5317\u4eac\u5750\u6807\uff09\r\n- \"\u6b66\u6c49\u672c\u5468\u7684\u5929\u6c14\u9884\u62a5\"\r\n- \"\u67e5\u8be2\u91cd\u5e862024\u5e747\u670815\u65e5\u52307\u670817\u65e5\u7684\u5929\u6c14\"\r\n\r\n#### \u822a\u73ed\u4fe1\u606f\u67e5\u8be2\r\n- \"\u67e5\u8be2\u822a\u73edCA1234\u7684\u8be6\u7ec6\u4fe1\u606f\"\r\n- \"MU5678\u8fd9\u4e2a\u822a\u73ed\u73b0\u5728\u4ec0\u4e48\u72b6\u6001\"\r\n- \"\u5e2e\u6211\u67e5\u770b\u822a\u73edHU7890\u7684\u5ea7\u4f4d\u548c\u4ef7\u683c\u4fe1\u606f\"\r\n- \"CZ3691\u822a\u73ed\u7684\u767b\u673a\u53e3\u548c\u822a\u7ad9\u697c\u4fe1\u606f\"\r\n\r\n#### \u5b9e\u65f6\u822a\u73ed\u8ddf\u8e2a\u67e5\u8be2\r\n- \"\u67e5\u8be2\u822a\u73edCCA1234\u7684\u5b9e\u65f6\u72b6\u6001\u548c\u4f4d\u7f6e\"\r\n- \"\u67e5\u770b\u5317\u4eac\u9996\u90fd\u673a\u573a\u5468\u8fb9\u6709\u54ea\u4e9b\u822a\u73ed\"\r\n- \"\u67e5\u8be2\u5317\u4eac\u5730\u533a\uff08\u7eac\u5ea639-41\uff0c\u7ecf\u5ea6115-118\uff09\u5185\u7684\u6240\u6709\u822a\u73ed\"\r\n- \"\u540c\u65f6\u8ddf\u8e2a\u822a\u73edCCA1234\u3001CSN5678\u3001MU9876\u7684\u5b9e\u65f6\u72b6\u6001\"\r\n- \"\u67e5\u770b\u6d66\u4e1c\u673a\u573a\u9644\u8fd1\u6b63\u5728\u98de\u884c\u7684\u822a\u73ed\"\r\n- \"\u8fd9\u67b6\u98de\u673a\u73b0\u5728\u5728\u54ea\u91cc\uff1f\u98de\u884c\u9ad8\u5ea6\u548c\u901f\u5ea6\u662f\u591a\u5c11\uff1f\"\r\n\r\n#### \u65e5\u671f\u65f6\u95f4\u67e5\u8be2\r\n- \"\u4eca\u5929\u662f\u51e0\u53f7\"\r\n- \"\u73b0\u5728\u7684\u65e5\u671f\u548c\u65f6\u95f4\u662f\u4ec0\u4e48\"\r\n- \"\u5e2e\u6211\u83b7\u53d6\u5f53\u524d\u65e5\u671f\"\r\n\r\n#### \u7efc\u5408\u67e5\u8be2\u793a\u4f8b\r\n- \"\u6211\u8981\u4ece\u6210\u90fd\u98de\u5317\u4eac\uff0c\u660e\u5929\u51fa\u53d1\uff0c\u987a\u4fbf\u544a\u8bc9\u6211\u5317\u4eac\u7684\u5929\u6c14\"\r\n- \"\u67e5\u8be2\u4e0a\u6d77\u5230\u5e7f\u5dde\u7684\u822a\u73ed\uff0c\u8fd8\u6709\u5e7f\u5dde\u7684\u5929\u6c14\u60c5\u51b5\"\r\n- \"\u5e2e\u6211\u89c4\u5212\u4ece\u91cd\u5e86\u5230\u4e1c\u4eac\u7684\u884c\u7a0b\uff0c\u9700\u8981\u4e2d\u8f6c\uff0c\u5e76\u67e5\u770b\u76ee\u7684\u5730\u5929\u6c14\"\r\n- \"\u67e5\u8be2CA1234\u822a\u73ed\u4fe1\u606f\uff0c\u4ee5\u53ca\u51fa\u53d1\u5730\u548c\u76ee\u7684\u5730\u7684\u5929\u6c14\"\r\n- \"\u6211\u7684\u822a\u73ed\u662fMU5678\uff0c\u5e2e\u6211\u67e5\u770b\u822a\u73ed\u72b6\u6001\u548c\u5ea7\u4f4d\u60c5\u51b5\"\r\n- \"\u67e5\u8be2CCA1234\u822a\u73ed\u7684\u5b9e\u65f6\u4f4d\u7f6e\uff0c\u540c\u65f6\u544a\u8bc9\u6211\u76ee\u7684\u5730\u5929\u6c14\"\r\n- \"\u6211\u60f3\u77e5\u9053\u5317\u4eac\u673a\u573a\u73b0\u5728\u6709\u54ea\u4e9b\u822a\u73ed\u8d77\u98de\uff0c\u4ee5\u53ca\u5317\u4eac\u7684\u5929\u6c14\u72b6\u51b5\"\r\n\r\n## API\u53c2\u8003\r\n\r\n### \u822a\u73ed\u8def\u7ebf\u67e5\u8be2\r\n```python\r\nsearchFlightRoutes(departure_city, destination_city, departure_date)  # \u6839\u636e\u51fa\u53d1\u5730\u3001\u76ee\u7684\u5730\u548c\u65e5\u671f\u67e5\u8be2\u53ef\u7528\u822a\u73ed\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `departure_city`: \u51fa\u53d1\u57ce\u5e02\u540d\u79f0\u6216\u673a\u573a\u4ee3\u7801 (\u5982: \"\u91cd\u5e86\", \"CKG\", \"\u91cd\u5e86(CKG)\")\r\n- `destination_city`: \u76ee\u7684\u5730\u57ce\u5e02\u540d\u79f0\u6216\u673a\u573a\u4ee3\u7801 (\u5982: \"\u5e7f\u5dde\", \"CAN\", \"\u5e7f\u5dde(CAN)\")\r\n- `departure_date`: \u51fa\u53d1\u65e5\u671f (YYYY-MM-DD\u683c\u5f0f)\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u822a\u73ed\u5217\u8868\uff08\u5305\u542b\u822a\u73ed\u53f7\u3001\u822a\u7a7a\u516c\u53f8\u3001\u8d77\u98de\u5230\u8fbe\u65f6\u95f4\u3001\u673a\u573a\u3001\u822a\u7ad9\u697c\u3001\u4ef7\u683c\uff09\r\n- \u4ef7\u683c\u7edf\u8ba1\uff08\u6700\u4f4e\u4ef7\u3001\u6700\u9ad8\u4ef7\u3001\u5e73\u5747\u4ef7\uff09\r\n- \u822a\u7a7a\u516c\u53f8\u5206\u5e03\u7edf\u8ba1\r\n- \u683c\u5f0f\u5316\u7684\u67e5\u8be2\u7ed3\u679c\u8f93\u51fa\r\n- \u652f\u6301\u7684\u57ce\u5e02\uff1a282\u4e2a\u56fd\u5185\u57ce\u5e02\u548c\u673a\u573a\r\n\r\n\u652f\u6301\u7684\u57ce\u5e02\u683c\u5f0f\uff1a\r\n- \u57ce\u5e02\u540d\uff1a\u4e0a\u6d77\u3001\u5317\u4eac\u3001\u91cd\u5e86\u3001\u5e7f\u5dde\u7b49\r\n- \u673a\u573a\u4ee3\u7801\uff1aSHA\u3001BJS\u3001CKG\u3001CAN\u7b49\r\n- \u5b8c\u6574\u683c\u5f0f\uff1a\u4e0a\u6d77(SHA)\u3001\u5317\u4eac(BJS)\u7b49\r\n\r\n### \u822a\u73ed\u4e2d\u8f6c\u8def\u7ebf\u67e5\u8be2\r\n```python\r\ngetTransferFlightsByThreePlace(from_place, transfer_place, to_place, min_transfer_time, max_transfer_time)\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `from_place`: \u51fa\u53d1\u5730\u57ce\u5e02\u540d\u79f0\u6216\u673a\u573a\u4ee3\u7801 (\u5982: \"\u5317\u4eac\", \"BJS\")\r\n- `transfer_place`: \u4e2d\u8f6c\u5730\u57ce\u5e02\u540d\u79f0\u6216\u673a\u573a\u4ee3\u7801 (\u5982: \"\u9999\u6e2f\", \"HKG\")  \r\n- `to_place`: \u76ee\u7684\u5730\u57ce\u5e02\u540d\u79f0\u6216\u673a\u573a\u4ee3\u7801 (\u5982: \"\u7ebd\u7ea6\", \"NYC\")\r\n- `min_transfer_time`: \u6700\u5c0f\u4e2d\u8f6c\u65f6\u95f4\uff08\u5c0f\u65f6\uff09\uff0c\u9ed8\u8ba42.0\u5c0f\u65f6\r\n- `max_transfer_time`: \u6700\u5927\u4e2d\u8f6c\u65f6\u95f4\uff08\u5c0f\u65f6\uff09\uff0c\u9ed8\u8ba45.0\u5c0f\u65f6\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u7b26\u5408\u6761\u4ef6\u7684\u4e2d\u8f6c\u822a\u73ed\u7ec4\u5408\u5217\u8868\r\n- \u7b2c\u4e00\u6bb5\u822a\u7a0b\u8be6\u7ec6\u4fe1\u606f\uff08\u51fa\u53d1\u5730\u5230\u4e2d\u8f6c\u5730\uff09\r\n- \u7b2c\u4e8c\u6bb5\u822a\u7a0b\u8be6\u7ec6\u4fe1\u606f\uff08\u4e2d\u8f6c\u5730\u5230\u76ee\u7684\u5730\uff09\r\n- \u5b9e\u9645\u4e2d\u8f6c\u65f6\u95f4\u8ba1\u7b97\r\n- \u822a\u73ed\u53f7\u3001\u65f6\u95f4\u3001\u673a\u573a\u7b49\u8be6\u7ec6\u4fe1\u606f\r\n\r\n### \u5929\u6c14\u4fe1\u606f\u67e5\u8be2\r\n\r\n#### \u6309\u7ecf\u7eac\u5ea6\u67e5\u8be2\r\n```python\r\ngetWeatherByLocation(latitude, longitude, start_date, end_date)\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `latitude`: \u7eac\u5ea6 (\u5982: 39.9042)\r\n- `longitude`: \u7ecf\u5ea6 (\u5982: 116.4074)\r\n- `start_date`: \u5f00\u59cb\u65e5\u671f (YYYY-MM-DD\u683c\u5f0f)\uff0c\u53ef\u9009\r\n- `end_date`: \u7ed3\u675f\u65e5\u671f (YYYY-MM-DD\u683c\u5f0f)\uff0c\u53ef\u9009\r\n\r\n#### \u6309\u57ce\u5e02\u540d\u67e5\u8be2\r\n```python\r\ngetWeatherByCity(city_name, start_date, end_date)\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `city_name`: \u57ce\u5e02\u540d\u79f0 (\u5982: \"\u5317\u4eac\", \"\u4e0a\u6d77\", \"\u6b66\u6c49\")\r\n- `start_date`: \u5f00\u59cb\u65e5\u671f (YYYY-MM-DD\u683c\u5f0f)\uff0c\u53ef\u9009\r\n- `end_date`: \u7ed3\u675f\u65e5\u671f (YYYY-MM-DD\u683c\u5f0f)\uff0c\u53ef\u9009\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u5929\u6c14\u72b6\u51b5\u63cf\u8ff0\r\n- \u6e29\u5ea6\u4fe1\u606f\uff08\u6700\u9ad8\u6e29\u3001\u6700\u4f4e\u6e29\u3001\u5f53\u524d\u6e29\u5ea6\uff09\r\n- \u6e7f\u5ea6\u3001\u98ce\u901f\u3001\u98ce\u5411\r\n- \u964d\u6c34\u6982\u7387\u548c\u964d\u6c34\u91cf\r\n- \u65e5\u51fa\u65e5\u843d\u65f6\u95f4\r\n- \u7d2b\u5916\u7ebf\u6307\u6570\r\n\r\n### \u822a\u73ed\u4fe1\u606f\u67e5\u8be2\r\n```python\r\ngetFlightInfo(flight_number)  # \u6839\u636e\u822a\u73ed\u53f7\u67e5\u8be2\u8be6\u7ec6\u822a\u73ed\u4fe1\u606f\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `flight_number`: \u822a\u73ed\u53f7 (\u5982: \"CA1234\", \"MU5678\", \"CZ3691\")\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u822a\u73ed\u57fa\u672c\u4fe1\u606f\uff08\u822a\u7a7a\u516c\u53f8\u3001\u673a\u578b\u3001\u822a\u7ebf\u7c7b\u578b\uff09\r\n- \u822a\u7ebf\u4fe1\u606f\uff08\u51fa\u53d1\u548c\u5230\u8fbe\u673a\u573a\u3001\u822a\u7ad9\u697c\u3001\u767b\u673a\u53e3\uff09\r\n- \u5b9e\u65f6\u72b6\u6001\uff08\u51c6\u65f6\u3001\u5ef6\u8bef\u3001\u767b\u673a\u3001\u98de\u884c\u4e2d\u3001\u5df2\u5230\u8fbe\u7b49\uff09\r\n- \u5ea7\u4f4d\u914d\u7f6e\uff08\u7ecf\u6d4e\u8231\u3001\u5546\u52a1\u8231\u3001\u5934\u7b49\u8231\u5ea7\u4f4d\u6570\uff09\r\n- \u4ef7\u683c\u4fe1\u606f\uff08\u5404\u8231\u4f4d\u4ef7\u683c\u548c\u53ef\u7528\u6027\uff09\r\n- \u5929\u6c14\u4fe1\u606f\uff08\u51fa\u53d1\u5730\u548c\u76ee\u7684\u5730\u5f53\u524d\u5929\u6c14\uff09\r\n- \u9644\u52a0\u670d\u52a1\uff08\u503c\u673a\u67dc\u53f0\u3001\u884c\u674e\u989d\u5ea6\u3001\u9910\u98df\u3001WiFi\u7b49\uff09\r\n\r\n\u652f\u6301\u7684\u822a\u73ed\u53f7\u683c\u5f0f\uff1a\r\n- \u4e2d\u56fd\u56fd\u9645\u822a\u7a7a\uff1aCA1234\u3001CA8901\r\n- \u4e2d\u56fd\u4e1c\u65b9\u822a\u7a7a\uff1aMU5678\u3001MU2468\r\n- \u4e2d\u56fd\u5357\u65b9\u822a\u7a7a\uff1aCZ3691\u3001CZ1357\r\n- \u6d77\u5357\u822a\u7a7a\uff1aHU7890\r\n- \u53a6\u95e8\u822a\u7a7a\uff1aMF8123\r\n- \u6625\u79cb\u822a\u7a7a\uff1a9C8765\r\n- \u5409\u7965\u822a\u7a7a\uff1aHO1288\r\n- \u56fd\u5916\u822a\u7a7a\uff1aUA858\u3001NH955 \u7b49\r\n\r\n### \u5b9e\u65f6\u822a\u73ed\u8ddf\u8e2a\r\n\r\n#### \u822a\u73ed\u5b9e\u65f6\u72b6\u6001\u67e5\u8be2\r\n```python\r\ngetFlightStatus(flight_number, date=None)  # \u67e5\u8be2\u822a\u73ed\u5b9e\u65f6\u72b6\u6001\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `flight_number`: \u822a\u73ed\u547c\u53f7 (\u5982: \"CCA1234\", \"CSN5678\", \"MU9876\")\r\n- `date`: \u65e5\u671f\u53c2\u6570\uff08OpenSky\u4ec5\u652f\u6301\u5b9e\u65f6\u6570\u636e\uff0c\u6b64\u53c2\u6570\u88ab\u5ffd\u7565\uff09\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u822a\u73ed\u5b9e\u65f6\u4f4d\u7f6e\uff08\u7ecf\u7eac\u5ea6\u3001\u9ad8\u5ea6\uff09\r\n- \u98de\u884c\u901f\u5ea6\uff08\u5730\u9762\u901f\u5ea6\u3001\u5782\u76f4\u901f\u5ea6\uff09\r\n- \u822a\u73ed\u72b6\u6001\uff08\u98de\u884c\u4e2d\u3001\u5730\u9762\u3001\u6ed1\u884c\u3001\u9759\u6b62\uff09\r\n- \u822a\u5411\u89d2\u548c\u9ad8\u5ea6\u4fe1\u606f\r\n- \u6700\u540e\u8054\u7cfb\u65f6\u95f4\r\n- \u8d77\u6e90\u56fd\u5bb6\u4fe1\u606f\r\n\r\n#### \u673a\u573a\u5468\u8fb9\u822a\u73ed\u67e5\u8be2\r\n```python\r\ngetAirportFlights(airport_code, flight_type=\"departure\")  # \u67e5\u8be2\u673a\u573a\u5468\u8fb9\u822a\u73ed\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `airport_code`: \u673a\u573a\u4ee3\u7801 (\u5982: \"PEK\", \"PVG\", \"CAN\", \"CTU\", \"XIY\")\r\n- `flight_type`: \u822a\u73ed\u7c7b\u578b\uff08\u6b64\u53c2\u6570\u4ec5\u4e3a\u517c\u5bb9\u6027\uff0cOpenSky\u8fd4\u56de\u6240\u6709\u822a\u73ed\uff09\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u673a\u573a\u5468\u8fb930\u516c\u91cc\u8303\u56f4\u5185\u7684\u6240\u6709\u822a\u73ed\r\n- \u6bcf\u67b6\u822a\u73ed\u7684\u5b9e\u65f6\u4f4d\u7f6e\u548c\u72b6\u6001\r\n- \u822a\u73ed\u547c\u53f7\u3001\u901f\u5ea6\u3001\u9ad8\u5ea6\u4fe1\u606f\r\n- \u673a\u573a\u5750\u6807\u548c\u641c\u7d22\u8303\u56f4\r\n\r\n\u652f\u6301\u7684\u673a\u573a\u4ee3\u7801\uff0870+\u4e2a\uff09\uff1a\r\n- \u5317\u4eac\uff1aPEK\uff08\u9996\u90fd\uff09\u3001PKX\uff08\u5927\u5174\uff09\r\n- \u4e0a\u6d77\uff1aPVG\uff08\u6d66\u4e1c\uff09\u3001SHA\uff08\u8679\u6865\uff09\r\n- \u5e7f\u5dde\uff1aCAN\u3001\u6df1\u5733\uff1aSZX\u3001\u6210\u90fd\uff1aCTU/TFU\r\n- \u91cd\u5e86\uff1aCKG\u3001\u897f\u5b89\uff1aXIY\u3001\u6606\u660e\uff1aKMG\r\n- \u676d\u5dde\uff1aHGH\u3001\u5357\u4eac\uff1aNKG\u3001\u6b66\u6c49\uff1aWUH\r\n- \u4ee5\u53ca\u5176\u4ed6\u4e3b\u8981\u57ce\u5e02\u673a\u573a\r\n\r\n#### \u533a\u57df\u822a\u73ed\u67e5\u8be2\r\n```python\r\ngetFlightsInArea(min_lat, max_lat, min_lon, max_lon)  # \u67e5\u8be2\u6307\u5b9a\u533a\u57df\u5185\u822a\u73ed\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `min_lat`: \u6700\u5c0f\u7eac\u5ea6 (\u5982: 39.0)\r\n- `max_lat`: \u6700\u5927\u7eac\u5ea6 (\u5982: 41.0)\r\n- `min_lon`: \u6700\u5c0f\u7ecf\u5ea6 (\u5982: 115.0)\r\n- `max_lon`: \u6700\u5927\u7ecf\u5ea6 (\u5982: 118.0)\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u6307\u5b9a\u5730\u7406\u533a\u57df\u5185\u7684\u6240\u6709\u5b9e\u65f6\u822a\u73ed\r\n- \u822a\u73ed\u4f4d\u7f6e\u3001\u901f\u5ea6\u3001\u9ad8\u5ea6\u7b49\u8be6\u7ec6\u4fe1\u606f\r\n- \u8fb9\u754c\u6846\u5750\u6807\u548c\u67e5\u8be2\u8303\u56f4\r\n\r\n#### \u6279\u91cf\u822a\u73ed\u8ddf\u8e2a\r\n```python\r\ntrackMultipleFlights(flight_numbers, date=None)  # \u6279\u91cf\u8ddf\u8e2a\u591a\u4e2a\u822a\u73ed\r\n```\r\n\r\n\u8f93\u5165\u53c2\u6570\uff1a\r\n- `flight_numbers`: \u822a\u73ed\u547c\u53f7\u5217\u8868 (\u5982: [\"CCA1234\", \"CSN5678\", \"MU9876\"])\r\n- `date`: \u65e5\u671f\u53c2\u6570\uff08OpenSky\u4ec5\u652f\u6301\u5b9e\u65f6\u6570\u636e\uff09\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u591a\u4e2a\u822a\u73ed\u7684\u5b9e\u65f6\u72b6\u6001\u6c47\u603b\r\n- \u6bcf\u4e2a\u822a\u73ed\u7684\u8be6\u7ec6\u67e5\u8be2\u7ed3\u679c\r\n- \u6210\u529f\u67e5\u8be2\u6570\u91cf\u7edf\u8ba1\r\n- \u6279\u91cf\u67e5\u8be2\u6267\u884c\u65f6\u95f4\r\n\r\n\u6ce8\u610f\u4e8b\u9879\uff1a\r\n- OpenSky Network\u4ec5\u63d0\u4f9b\u5b9e\u65f6\u6570\u636e\uff0c\u4e0d\u652f\u6301\u5386\u53f2\u822a\u73ed\u67e5\u8be2\r\n- API\u6709\u9891\u7387\u9650\u5236\uff0c\u6279\u91cf\u67e5\u8be2\u65f6\u4f1a\u81ea\u52a8\u6dfb\u52a0\u5ef6\u65f6\r\n- \u90e8\u5206\u822a\u73ed\u53ef\u80fd\u65e0\u547c\u53f7\u4fe1\u606f\u6216\u4f4d\u7f6e\u6570\u636e\u4e0d\u5b8c\u6574\r\n- \u6570\u636e\u7cbe\u5ea6\u548c\u53ef\u7528\u6027\u53d6\u51b3\u4e8eADS-B\u4fe1\u53f7\u8986\u76d6\r\n\r\n### \u65e5\u671f\u65f6\u95f4\u5de5\u5177\r\n```python\r\ngetCurrentDate()  # \u83b7\u53d6\u5f53\u524d\u65e5\u671f\uff08YYYY-MM-DD\u683c\u5f0f\uff09\r\n```\r\n\r\n\u8f93\u51fa\u4fe1\u606f\uff1a\r\n- \u5f53\u524d\u7cfb\u7edf\u65e5\u671f\u5b57\u7b26\u4e32\r\n\r\n## \u5f00\u53d1\r\n\r\n### \u9879\u76ee\u7ed3\u6784\r\n```\r\nFlightTicketMCPServer/\r\n\u251c\u2500\u2500 flight_ticket_server/\r\n\u2502   \u251c\u2500\u2500 core/              # \u6838\u5fc3\u4e1a\u52a1\u903b\u8f91\r\n\u2502   \u251c\u2500\u2500 tools/             # MCP\u5de5\u5177\u5b9e\u73b0\r\n\u2502   \u251c\u2500\u2500 utils/             # \u5b9e\u7528\u5de5\u5177\u51fd\u6570\r\n\u2502   \u2514\u2500\u2500 main.py            # \u670d\u52a1\u5668\u5165\u53e3\u70b9\r\n\u251c\u2500\u2500 office_flight_ticket_server/  # \u989d\u5916\u6a21\u5757\r\n\u251c\u2500\u2500 tests/                 # \u6d4b\u8bd5\u6587\u4ef6\r\n\u251c\u2500\u2500 logs/                  # \u65e5\u5fd7\u6587\u4ef6\u76ee\u5f55\r\n\u251c\u2500\u2500 pyproject.toml         # \u9879\u76ee\u914d\u7f6e\r\n\u251c\u2500\u2500 requirements.txt       # \u9879\u76ee\u4f9d\u8d56\r\n\u251c\u2500\u2500 flight_ticket_server.py # \u4e3b\u542f\u52a8\u6587\u4ef6\r\n\u251c\u2500\u2500 mcp-config.json        # MCP\u914d\u7f6e\u793a\u4f8b\r\n\u2514\u2500\u2500 README.md              # \u9879\u76ee\u6587\u6863\r\n```\r\n\r\n### \u6d4b\u8bd5\r\n\r\n```bash\r\n# \u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\r\npython -m pytest tests/ -v\r\n\r\n# \u8fd0\u884c\u57fa\u672c\u529f\u80fd\u6d4b\u8bd5\r\npython -m pytest tests/test_basic.py -v\r\n\r\n# \u8fd0\u884c\u7279\u5b9a\u6d4b\u8bd5\r\npython -m pytest tests/test_basic.py::TestFlightSearch::test_searchFlightsByNumber -v\r\n```\r\n\r\n### \u65e5\u5fd7\u548c\u8c03\u8bd5\r\n\r\n- \u65e5\u5fd7\u6587\u4ef6\u4f4d\u7f6e\uff1a`logs/` \u76ee\u5f55\r\n- \u542f\u7528\u8c03\u8bd5\u6a21\u5f0f\uff1a\u8bbe\u7f6e `MCP_DEBUG=true`\r\n- \u67e5\u770b\u5b9e\u65f6\u65e5\u5fd7\uff1a`tail -f logs/flight_server.log`\r\n\r\n## \u6545\u969c\u6392\u9664\r\n\r\n### \u5e38\u89c1\u95ee\u9898\r\n\r\n1. **\u7aef\u53e3\u88ab\u5360\u7528**\r\n   ```bash\r\n   # \u66f4\u6539\u7aef\u53e3\r\n   set MCP_PORT=8001\r\n   python flight_ticket_server.py\r\n   ```\r\n\r\n2. **\u5bfc\u5165\u9519\u8bef**\r\n   ```bash\r\n   # \u786e\u4fdd\u5728\u6b63\u786e\u7684\u76ee\u5f55\r\n   cd FlightTicketMCPServer/flight_ticket_server\r\n   python flight_ticket_server.py\r\n   ```\r\n\r\n3. **\u6743\u9650\u95ee\u9898**\r\n   ```bash\r\n   # \u68c0\u67e5\u6587\u4ef6\u6743\u9650\r\n   ls -la flight_ticket_server.py\r\n   chmod +x flight_ticket_server.py\r\n   ```\r\n\r\n### \u65e5\u5fd7\u5206\u6790\r\n\r\n\u67e5\u770b\u65e5\u5fd7\u6587\u4ef6\u4e86\u89e3\u8be6\u7ec6\u9519\u8bef\u4fe1\u606f\uff1a\r\n```bash\r\n# \u67e5\u770b\u4e00\u822c\u65e5\u5fd7\r\ncat logs/flight_server.log\r\n\r\n# \u67e5\u770b\u9519\u8bef\u65e5\u5fd7\r\ncat logs/flight_server_error.log\r\n\r\n# \u5b9e\u65f6\u76d1\u63a7\u65e5\u5fd7\r\ntail -f logs/flight_server.log\r\n```\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nMIT License - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\u3002\r\n\r\n## \u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\u6765\u6539\u8fdb\u8fd9\u4e2a\u9879\u76ee\u3002\r\n\r\n## \u652f\u6301\r\n\r\n\u5982\u679c\u60a8\u9047\u5230\u95ee\u9898\u6216\u6709\u529f\u80fd\u5efa\u8bae\uff0c\u8bf7\u5728GitHub\u4e0a\u521b\u5efaIssue\u3002\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u4e00\u4e2a\u57fa\u4e8e\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae(MCP)\u7684\u822a\u7a7a\u673a\u7968\u67e5\u8be2\u548c\u7ba1\u7406\u670d\u52a1\u5668",
    "version": "1.0.1",
    "project_urls": {
        "Documentation": "https://github.com/yourusername/flight-ticket-mcp-server#readme",
        "Homepage": "https://github.com/yourusername/flight-ticket-mcp-server",
        "Issues": "https://github.com/yourusername/flight-ticket-mcp-server/issues",
        "Repository": "https://github.com/yourusername/flight-ticket-mcp-server"
    },
    "split_keywords": [
        "mcp",
        " flight",
        " ticket",
        " search",
        " ai",
        " fastmcp"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a6de95ee073335ac2f55ddc7469f9d77f606cd8c89231b032e2ce1897d640948",
                "md5": "5de2e4ff184965fa437e13c5fe589d9b",
                "sha256": "585c943c84137ee7cce747cd6c047622d078c8185e11858bc9f92de0902da0b4"
            },
            "downloads": -1,
            "filename": "flight_ticket_mcp_server-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5de2e4ff184965fa437e13c5fe589d9b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 56410,
            "upload_time": "2025-08-31T10:51:40",
            "upload_time_iso_8601": "2025-08-31T10:51:40.303320Z",
            "url": "https://files.pythonhosted.org/packages/a6/de/95ee073335ac2f55ddc7469f9d77f606cd8c89231b032e2ce1897d640948/flight_ticket_mcp_server-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "70da6fcbe4a0b264a6b3e41be64853999ce723f636b70f93d3e007b41fe21cfe",
                "md5": "f38caf7b80a1f0bdc0f79aa837b5dfcb",
                "sha256": "d0075c0f5019c40e48585b98aaa034befdbaa6581d78a8a3f504a7cabd8c8482"
            },
            "downloads": -1,
            "filename": "flight_ticket_mcp_server-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "f38caf7b80a1f0bdc0f79aa837b5dfcb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 59580,
            "upload_time": "2025-08-31T10:51:42",
            "upload_time_iso_8601": "2025-08-31T10:51:42.707914Z",
            "url": "https://files.pythonhosted.org/packages/70/da/6fcbe4a0b264a6b3e41be64853999ce723f636b70f93d3e007b41fe21cfe/flight_ticket_mcp_server-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-31 10:51:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "flight-ticket-mcp-server",
    "github_not_found": true,
    "lcname": "flight-ticket-mcp-server"
}
        
Elapsed time: 8.53916s