途牛火车票预订技能
途牛火车票助手 - 通过 exec + curl 调用 MCP 实现车次列表搜索、查询车次详情、预订下单。适用于用户查询车次列表、查询车次详情或提交火车票订单时使用。
安装 / 下载方式
TotalClaw CLI推荐
totalclaw install totalclaw:leonardoooooo~tuniu-traincURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Aleonardoooooo~tuniu-train/file -o tuniu-train.mdGit 仓库获取源码
git clone https://github.com/openclaw/skills/commit/eb9152879752a50520f53bb16ea28817c0bae7ab# 途牛火车票助手
当用户查询车次列表、查询具体车次详情或火车票预订时,使用此 skill 通过 exec 执行 curl 调用途牛火车票 MCP 服务。
## 运行环境要求
本 skill 通过 **shell exec** 执行 **curl** 向 MCP endpoint 发起 HTTP POST 请求,使用 JSON-RPC 2.0 / `tools/call` 协议。**运行环境必须提供 curl 或等效的 HTTP 调用能力**(如 wget、fetch 等可发起 POST 的客户端),否则无法调用 MCP 服务。
## 隐私与个人信息(PII)说明
预订功能会将用户提供的**个人信息**(联系人姓名、手机号、乘客姓名、证件号等)通过 HTTP POST 发送至途牛火车票 MCP 远端服务(`https://openapi.tuniu.cn/mcp/train`) ,以完成火车票预订。使用本 skill 即表示用户知晓并同意上述 PII 被发送到外部服务。请勿在日志或回复中暴露用户个人信息。
## 适用场景
- 按出发站、到达站、出发日期查询车次列表(第一页、翻页)
- 查看指定车次的坐等价格信息
- 用户确认后创建火车票预订订单
## 配置要求
### 必需配置
- **TUNIU_API_KEY**:途牛开放平台 API key,用于 `apiKey` 请求头
用户需在[途牛开放平台](https://open.tuniu.com/mcp)注册并获取上述密钥。
### 可选配置
- **TRAIN_MCP_URL**:MCP 服务地址,默认 `https://openapi.tuniu.cn/mcp/train`
## 调用方式
**直接调用工具**:使用以下请求头调用 `tools/call` 即可:
- `apiKey: $TUNIU_API_KEY`
- `Content-Type: application/json`
- `Accept: application/json, text/event-stream`
## 可用工具
**重要**:下方示例中的参数均为占位,调用时需**根据用户当前需求**填入实际值(出发站、出发日期、车次号、出行人、联系方式等),勿直接照抄示例值。
### 1. 查询车次列表 (searchLowestPriceTrain)
**首次查询**:必填 `departureCityName`、`arrivalCityName`、`departureDate`(格式 yyyy-MM-dd),非必填 `departureTime`(出发时间范围,如`08:00-12:00`)、`arrivalTime`(到达时间范围,如`18:00-20:00`)。
入参示例:
```markdown
{
"departureCityName": "南京",//出发站
"arrivalCityName": "上海",//到达站
"departureDate": "2026-03-20",//出发日期
"departureTime": "08:00-12:00",//出发时间范围
"arrivalTime": "18:00-20:00"//到达时间范围
}
```
出参示例:
```markdown
{
"successCode": true,
"data": [
{
"trainNum": "1461",//车次号
"departStationName": "南京",//出发站名称
"destStationName": "上海",//到达站名称
"trainType": "direct",
"departureTime": "2026-03-20 03:04",//出发时间
"arrivalTime": "2026-03-20 06:45",//到达时间
"price": {
"gjrwPrice": "",//高级软卧价格,“”表示无此坐等
"rwPrice": "140.5",//软卧价格
"rzPrice": "",//软座价格
"swzPrice": "",//商务座价格
"tdzPrice": "",//特等座价格
"wzPrice": "",//无座价格
"ywPrice": "94.5",//硬卧价格
"yzPrice": "40.5",//硬座价格
"edzPrice": "",//二等座价格
"ydzPrice": "",//一等座价格
"dwPrice": "",//动卧价格
"ydwPrice": "",//一等卧价格
"edwPrice": ""//二等卧价格
},
"duration": "3时41分",//运行时长
"seatAvailable": {
"gjrwNum": null,//高级软卧余票数量,null表示无此坐等,0表示没有余票,大于0表示有票
"rwNum": 0,//软卧余票数量
"rzNum": null,//软座余票数量
"swzNum": null,//商务座余票数量
"tdzNum": null,//特等座余票数量
"wzNum": null,//无座余票数量
"ywNum": 0,//硬卧余票数量
"yzNum": 0,//硬座余票数量
"edzNum": null,//二等座余票数量
"ydzNum": null,//一等座余票数量
"dwNum": null,//动卧余票数量
"ydwNum": null,//一等卧余票数量
"edwNum": null//二等卧余票数量
}
}
],
"queryId": "65979499413539",//快照id
"totalPageNum": 10//总页数
}
```
**非首次查询**:传入首次查询返回的快照id(queryId)和 `pageNum`(2=第二页,3=第三页…)。用户说「还有吗」「翻页」「下一页」时用queryId + pageNum 再次调用即可。
入参示例:
```markdown
{
"queryId": "65979499413539",//快照id
"pageNum": 2//页数
}
```
出参示例:
```markdown
{
"successCode": true,
"data": [
{
"trainNum": "K1505",//车次号
"departStationName": "南京",//出发站名称
"destStationName": "上海",//到达站名称
"trainType": "direct",
"departureTime": "2026-03-20 18:41",//出发时间
"arrivalTime": "2026-03-20 22:22",//到达时间
"price": {
"gjrwPrice": "",//高级软卧价格,“”表示无此坐等
"rwPrice": "146.5",//软卧价格
"rzPrice": "",//软座价格
"swzPrice": "",//商务座价格
"tdzPrice": "",//特等座价格
"wzPrice": "46.5",//无座价格
"ywPrice": "100.5",//硬卧价格
"yzPrice": "46.5",//硬座价格
"edzPrice": "",//二等座价格
"ydzPrice": "",//一等座价格
"dwPrice": "",//动卧价格
"ydwPrice": "",//一等卧价格
"edwPrice": ""//二等卧价格
},
"duration": "3时41分",//运行时长
"seatAvailable": {
"gjrwNum": null,//高级软卧余票数量,null表示无此坐等,0表示没有余票,大于0表示有票
"rwNum": 4,//软卧余票数量
"rzNum": null,//软座余票数量
"swzNum": null,//商务座余票数量
"tdzNum": null,//特等座余票数量
"wzNum": 0,//无座余票数量
"ywNum": 17,//硬卧余票数量
"yzNum": 0,//硬座余票数量
"edzNum": null,//二等座余票数量
"ydzNum": null,//一等座余票数量
"dwNum": null,//动卧余票数量
"ydwNum": null,//一等卧余票数量
"edwNum": null//二等卧余票数量
}
}
]
}
```
**触发词**:查询某日出发某站到某站的火车票
```bash
# 首次查询:出发站、到达站、出发日期按用户需求填写(日期格式 yyyy-MM-dd)
curl -s -X POST "${TRAIN_MCP_URL:-https://openapi.tuniu.cn/mcp/train}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "apiKey: $TUNIU_API_KEY" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"searchLowestPriceTrain","arguments":{"departureCityName":"<用户指定的出发站>","arrivalCityName":"<用户指定的到达站>","departureDate":"<用户指定的出发日期 yyyy-MM-dd>","departureTime":"<用户指定的出发时间范围,如08:00-12:00>","arrivalTime":"<用户指定的到达时间范围,如18:00-20:00>"}}}'
```
```bash
# 非首次查询:快照id(queryId) + pageNum
curl -s -X POST "${TRAIN_MCP_URL:-https://openapi.tuniu.cn/mcp/train}" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "apiKey: $TUNIU_API_KEY" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"searchLowestPriceTrain","arguments":{"queryId":"<快照id>","pageNum":2}}}'
```
### 2. 查询车次详情 (queryTrainDetail)
**入参**:`departureStationName`、`arrivalStationName`、`departureDate`(yyyy-MM-dd)、`trainNum`(车次号,从搜索结果获取)均为必填。
入参示例:
```markdown
{
"departureStationName": "南京南",//出发站
"arrivalStationName": "上海虹桥",//到达站
"departureDate": "2026-03-20",//出发日期
"trainNum": "G203"//车次号
}
```
**返回**:`trainInfo`(车次详情)、`seatInfo`(坐等信息,含 resId、price等)。**resId、price、departsDate 为下单必填,需保留供 bookTrain 使用。**
出参示例:
```markdown
{
"successCode": true,
"data": {
"isVoucherSaleForDetail": true,
"isVoucherSaleForGrab": "0",
"trainInfo": {
"id": "16203",
"trainId": "16203",//车次id
"trainNum": "G203",//车次号
"trainType": 0,//车次类型;0:高铁;1:城际;2:动车;3:直达;4:特快;5:普快;6:其他
"trainTypeCode": 0,//车次类型code
"trainTypeName": "高铁",//车次类型名称
"departCityId": "1602",//出发城市id
"destCityId": "2500",//到达城市id
"departStationName": "南京南",//出发站名称
"departStationCode": "1175373",//出发站code
"departStationType": "始发",//出发站是否始发;0:始发;1:终点;2:过路
"departStationTypeCode": 0,//出发站是否始发code;0:始发;1:终点;2:过路
"departureCityName": "南京",//出发城市名称
"destStationName": "上海虹桥",//到达站名称
"destStationCode": "1175076",//到达站code
"destStationType": "过路",//到达站是否终点;0:始发;1:终点;2:过路
"destStationTypeCode": 2,//到达站是否终点code;0:始发;1:终点;2:过路
"arrivalCityName": "上海",//到达城市名称
"departTime": "06:32",//出发时间
"arriveTime": "07:53",//到达时间
"saleStatus": "在售",//售卖状态;0:在售;1:停售;2:预售
"saleStatusId": 0,//售卖状态id;0:在售;1:停售;2:预售
"duration": "1时21分",//运行时长
"durationDay": 1,//历时天数;1:当天;2:第二天
"departsDate": "2026-03-20",//出发日期
"arriveDate": "2026-03-20",//到达日期
"memoDay": "",
"memoHour": "",
"departureDates": {
"yesterday": "2026-03-19",
"today": "2026-03-20",
"tomorrow": "2026-03-21"
},
"leftNumber": 99,
"seat": "二等座",
"price": 141.0,
"promotionPrice": 141.0,
"resId": 99,
"canGrap": true,
"oneLeftNumber": 0,
"supportSeatSelection": true,
"supportIdCheckin": true,
"supportTransferFlag": false
},
"seatInfo": [
{
"leftNumber": 99,//余票数量
"seatId": 3,//坐等id;0:商务座;1:特等座;2:一等座;3:二等座;4:高级软卧;5:软卧;6:硬卧;7:软座;8:硬座;9:无座;10:动卧;19.一等卧;20.二等卧
"seatName": "二等座",//坐等名称
"price": 141.0,//坐等价格
"adultPrice": 141.0,
"promotionPrice": 141.0,
"resId": 2121337089,//资源id
"seatStatus": "有",//坐等状态
"seatSequence": 0,
"lowestPrice": null,
"isConfigSeat": false,
"configSeatInfo": null,
"isSupportVoucherSection": true,
"trainVoucherInfo": []
},
{
"leftNumber": 0,
"seatId": 2,
"seatName": "一等座",
"price": 238.0,
"adultPrice": 238.0,
"promotionPrice": 238.0,