🚄 一句话创建 12306 火车票查询 Agent!OpenClaw 自动生成 Skill 实战全流程

不写接口
不写参数
不写调用逻辑
只说一句话:

“帮我创建 12306 火车票查询 skill”

OpenClaw 自动生成可运行的 Agent 实例。

这不是 Demo,这是完整可运行的实战。


🔥 这篇文章你将看到什么?

  • Docker 启动 12306 MCP 服务
  • mcporter 注册 MCP
  • OpenClaw 自动创建 Skill
  • 自然语言触发真实系统调用
  • 完整 Agent 调用闭环

我们不是在“聊天”,
我们是在构建一个真正可执行的 AI Agent。


🧠 一、整体架构:从会话到真实系统调用

整体结构如下:

用户会话指令
        ↓
OpenClaw Agent
        ↓
mcporter Skill
        ↓
12306 MCP Server(Docker)
        ↓
12306 官方接口

这不是简单 API 调用,而是:

会话 → Skill 自动生成 → MCP 绑定 → 执行 → 结果结构化输出


⚙️ 二、启动 12306 MCP 服务(Docker 方式)

首先我们启动 12306 MCP 服务。

docker run -p 8080:8080 -d lance159/12306-mcp npx 12306-mcp --port 8080

推荐使用 docker-compose:

services:
  mcp12306:
    image: lance159/12306-mcp
    command: npx 12306-mcp --port 8080
    ports:
      - "127.0.0.1:8080:8080"

安全说明:

  • 绑定 127.0.0.1 避免公网暴露
  • 服务只做只读查询
  • 不涉及购票

启动后访问:

http://127.0.0.1:8080/sse

🔧 三、配置 mcporter 连接 MCP

创建文件:

~/.mcporter/mcporter.json
{
  "mcpServers": {
    "12306": {
      "type": "sse",
      "url": "http://127.0.0.1:8080/sse",
      "name": "12306 高铁动车查询",
      "description": "查询高铁(G)、动车(D)和城铁(C)余票,支持时间段过滤。",
      "enabled": true
    }
  }
}

此时,OpenClaw 已经具备调用 12306 查询能力。


🤖 四、关键演示:一句话自动创建 Skill

现在进入最重要的部分。

我们对 OpenClaw 说:

🗣 “帮我创建 12306 火车票查询 skill”

接下来发生了什么?


🧠 第一步:AI 理解你的意图

OpenClaw 自动识别:

  • 你要创建一个 Skill
  • 功能是铁路票务查询
  • 需要绑定 12306 MCP
  • 需要定义参数模型

⚙️ 第二步:自动生成 Skill 定义

OpenClaw 会生成类似结构:

name: mcporter-railway-query
description: 查询中国铁路12306高铁动车余票
tools:
  - name: get-tickets
    parameters:
      date: string
      fromStation: string
      toStation: string
      trainFilterFlags: string
      earliestStartTime: number
      latestStartTime: number

Skill 已自动实例化。

没有手写 YAML,没有写 JSON Schema。


🔗 第三步:自动绑定 MCP

OpenClaw 会读取:

~/.mcporter/mcporter.json

自动绑定:

Skill → 12306 MCP → Docker 服务

无需手动接 API。


🚀 五、真正的 Agent 执行能力

我们继续说:

“查询 2 月 14 日上海到江阴下午的高铁动车余票”

OpenClaw 自动:

  • 解析日期

  • 转换城市为站点代码(SHH → KYH)

  • 添加过滤条件:

    • trainFilterFlags=“GD”
    • earliestStartTime=12
    • latestStartTime=18

内部等价执行:

mcporter call 12306.get-tickets \
  date="2026-02-14" \
  fromStation="SHH" \
  toStation="KYH" \
  trainFilterFlags="GD" \
  earliestStartTime=12 \
  latestStartTime=18

但用户完全看不到 CLI。


📊 六、结果自动结构化输出

MCP 返回结构化数据:

{
  "trainNo": "G7744",
  "startTime": "14:59",
  "arriveTime": "16:09",
  "secondClass": "有"
}

OpenClaw 转换为自然语言:

根据查询结果,以下是2026年2月14日(明天)下午上海到江阴的高铁动车班次信息:

2月14日下午上海到江阴高铁班次详情:

  1. G2384 (14:54 上海虹桥 → 15:58 江阴)

    • 历时:1小时4分钟
    • 座位情况:所有席别均已无票
  2. G7744 (14:59 上海虹桥 → 16:09 江阴)

    • 历时:1小时10分钟
    • 座位情况:二等座剩余1张票 ¥71,无座有票 ¥71,一等座和商务座无票
  3. G800 (15:25 上海虹桥 → 16:29 江阴)

    • 历时:1小时4分钟
    • 座位情况:所有席别均已无票
  4. G7138 (16:17 上海虹桥 → 17:23 江阴)

    • 历时:1小时6分钟
    • 座位情况:所有席别均已无票
  5. G2818 (16:22 上海站 → 17:38 江阴)

    • 历时:1小时16分钟
    • 座位情况:所有席别均已无票
  6. G2422 (17:38 上海虹桥 → 18:49 江阴)

    • 历时:1小时11分钟
    • 座位情况:所有席别均已无票
  7. G7114 (17:57 上海虹桥 → 19:07 江阴)

    • 历时:1小时10分钟
    • 座位情况:所有席别均已无票

特别提醒:

  • 目前明天下午从上海到江阴的大部分高铁班次余票紧张,多数班次的各类席位均已售罄
  • 唯一还有少量余票的是G7744次列车(14:59从上海虹桥出发),仅剩1张二等座票(¥71)和部分无座票
  • 如果您计划明天下午从上海返回江阴,建议尽快预订G7744次列车的二等座或考虑无座票
  • 另外,早上有G7134次(12:07上海虹桥→13:24江阴)和G1420次(12:56上海虹桥→14:06江阴),但也都显示无票

建议您尽早通过12306官网或APP预订,或考虑其他时间段的列车。

这一步是 Agent 的核心价值:

结构化系统 → 语义理解 → 人类可读输出


🔥 七、这和传统自动化有什么区别?

传统方式 OpenClaw
写接口代码 自然语言生成
手写参数 自动推断
手写调用逻辑 自动构造 Tool Call
手动解析 JSON 自动转自然语言

这已经不是“聊天机器人”。

这是一个:

可组合、可扩展、可本地部署的 AI Agent 系统。


🔐 八、安全说明

本方案:

  • 不存储用户数据
  • 不进行购票操作
  • 不绕过 12306 验证
  • 仅做只读查询
  • Docker 绑定本地端口

属于安全可控部署。


🏁 九、总结

通过一句话:

“帮我创建 12306 火车票查询 skill”

我们完成了:

  • Skill 定义
  • MCP 绑定
  • 参数建模
  • 自动调用
  • 结果解释

这展示的是:

🧠 OpenClaw 已经具备“系统编排能力”,而不仅仅是对话能力。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐