[特殊字符] 一句话创建 12306 火车票查询 Agent!OpenClaw 自动生成 Skill 实战全流程
本文展示了如何通过OpenClaw平台实现一句话创建12306火车票查询Agent的全流程。主要内容包括:1) 使用Docker启动12306 MCP服务;2) 通过mcporter注册MCP服务;3) 仅用自然语言指令"帮我创建12306火车票查询skill"即可自动生成可运行的Agent实例;4) 完整演示从自然语言查询到系统调用的闭环过程。该方案实现了从结构化系统到语义理
🚄 一句话创建 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日下午上海到江阴高铁班次详情:
G2384 (14:54 上海虹桥 → 15:58 江阴)
- 历时:1小时4分钟
- 座位情况:所有席别均已无票
G7744 (14:59 上海虹桥 → 16:09 江阴)
- 历时:1小时10分钟
- 座位情况:二等座剩余1张票 ¥71,无座有票 ¥71,一等座和商务座无票
G800 (15:25 上海虹桥 → 16:29 江阴)
- 历时:1小时4分钟
- 座位情况:所有席别均已无票
G7138 (16:17 上海虹桥 → 17:23 江阴)
- 历时:1小时6分钟
- 座位情况:所有席别均已无票
G2818 (16:22 上海站 → 17:38 江阴)
- 历时:1小时16分钟
- 座位情况:所有席别均已无票
G2422 (17:38 上海虹桥 → 18:49 江阴)
- 历时:1小时11分钟
- 座位情况:所有席别均已无票
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 已经具备“系统编排能力”,而不仅仅是对话能力。
更多推荐


所有评论(0)