途牛火车票预订技能

ClawSkills 作者 leonardoooooo v1.0.0

途牛火车票助手 - 通过 exec + curl 调用 MCP 实现车次列表搜索、查询车次详情、预订下单。适用于用户查询车次列表、查询车次详情或提交火车票订单时使用。

源码 ↗

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install clawskills:leonardoooooo~tuniu-train
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/clawskills%3Aleonardoooooo~tuniu-train/file -o tuniu-train.md
Git 仓库获取源码
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,