
1. 从一句话到可执行 Agent12306 余票查询的真实落地场景你有没有过这种体验打开 12306 官网选日期、选出发站、选到达站、点查询、翻列表、对比时间……一套操作下来只是想看看「明天下午上海到江阴还有没有票」。如果把这套动作交给一个能听懂人话的 Agent你只需要说一句「帮我查 2 月 14 日上海到江阴下午的高铁余票」剩下的解析、调用、整理、播报全部自动完成。这就是 OpenClaw 自动生成 Skill 的价值所在。OpenClaw 是一个支持自然语言驱动 Skill 生成的 Agent 框架它能把你的口语化需求翻译成结构化的工具定义再通过 MCPModel Context Protocol绑定到真实的后端服务上。MCP 在这里扮演的角色可以理解成「Agent 和外部系统之间的标准插座」——只要服务端按 MCP 协议暴露能力Agent 就能即插即用不需要为每个接口手写适配代码。这篇文章面向三类人一是想入门 Agent 开发但不想从零写 Tool Call 的开发者二是手里有 Docker、想快速验证 MCP 链路的技术爱好者三是已经在用 OpenClaw 或类似框架、想把模型调用统一到 TaoToken 通道的实践者。整条链路覆盖 Agent 意图解析、MCP 工具注册、Docker 本地运行、Skill 自动生成、真实查询验证以及把模型 endpoint 切到 TaoToken 统一 Key 通道的完整操作。我试过把这套流程跑通之后最大的感受是真正麻烦的不是「调用接口」而是「让模型知道该调用哪个接口、传什么参数、怎么把结果讲成人话」。OpenClaw 的 Skill 自动生成恰好把这三件事串起来了。下面按可跟做的顺序从环境准备一路写到排障。2. TaoToken 前置准备统一 Key 通道与模型接入配置在跑通 12306 查询链路之前先把模型调用这一层理顺。OpenClaw 在解析意图、生成 Skill 定义、把结构化结果转成自然语言这几个环节都需要调用大模型。如果你每个模型都单独配 Key、单独记 endpoint维护成本会很高。TaoToken 提供的是统一 Key 通道一个 Key 走多个模型endpoint 也统一省去到处翻配置的麻烦。先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并拿到 API Key。拿到之后控制台在 https://taotoken.net/console Key 管理页在 https://taotoken.net/api-keys 接入文档在 https://taotoken.net/doc 。API 基础地址是 https://taotoken.net/api 注意这个地址不带 UTM 参数配置里直接写它。OpenClaw 的模型配置通常放在项目根目录的config或环境变量里。以环境变量方式为例你可以这样设置export OPENCLAW_MODEL_BASE_URLhttps://taotoken.net/api export OPENCLAW_MODEL_API_KEYsk-你的TaoTokenKey export OPENCLAW_MODEL_IDclaude-sonnet-4-20250514如果你用的是 Claude Code 这类工具做 Skill 定义的润色和调试它的配置文件和 OpenClaw 是分开的。Claude Code 的接入文档在 https://taotoken.net/doc 按文档把 Base URL 指向https://taotoken.net/apiKey 填同一个Model ID 按你实际用的模型填。这里要提醒一句Base URL、Key、Model ID 这三件套必须同时正确缺一个都会在调用时报错后面排障章节会具体讲。为什么建议把 endpoint 统一到 TaoToken因为 OpenClaw 在生成 Skill 时会做多轮模型调用第一轮理解意图第二轮生成 YAML 定义第三轮可能还要校验参数模型。如果每轮走不同供应商排查问题时你根本分不清是模型返回格式问题还是网络问题。统一通道之后日志里看到的请求都指向同一个 endpoint定位效率高很多。配置完成后建议先用一个最小请求验证通道是否通。可以用 curl 直接打模型对话接口curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 回复 OK}] }如果返回里有正常的choices字段和内容说明 Key 通道没问题。这一步别跳过很多人后面 Skill 生成失败其实是模型通道根本没通。你也可以直接在模型对话页 https://taotoken.net/models 里手动发一条消息确认账号和 Key 状态正常。3. 可复制配置Docker 启动 12306 MCP 与 mcporter 注册这一节是整条链路的核心配置部分所有片段都可以直接复制。先启动 12306 MCP 服务。这个服务的作用是把 12306 的余票查询能力按 MCP 协议暴露出来Agent 通过 SSE 连接它。用 Docker 一条命令启动docker run -p 127.0.0.1:8080:8080 -d lance159/12306-mcp npx 12306-mcp --port 8080注意端口映射写的是127.0.0.1:8080:8080不是8080:8080。前者只绑定本地回环公网访问不到后者会暴露到所有网卡。这个服务只做只读查询不涉及购票但绑定本地仍然是好习惯。如果你更习惯 docker-compose用下面这份services: mcp12306: image: lance159/12306-mcp command: npx 12306-mcp --port 8080 ports: - 127.0.0.1:8080:8080 restart: unless-stopped启动后访问http://127.0.0.1:8080/sse如果看到 SSE 流保持连接浏览器可能一直转圈或显示事件流说明服务起来了。用 curl 快速探一下curl -N http://127.0.0.1:8080/sse接下来配置 mcporter它是 OpenClaw 用来管理 MCP 服务连接的工具。创建文件~/.mcporter/mcporter.json内容如下{ mcpServers: { 12306: { type: sse, url: http://127.0.0.1:8080/sse, name: 12306 高铁动车查询, description: 查询高铁(G)、动车(D)和城铁(C)余票支持时间段过滤。, enabled: true } } }这份配置里type是sseurl指向本地 Docker 服务enabled为 true 表示启用。保存后mcporter 就能发现这个 MCP 服务。你可以用 mcporter 的命令行确认注册状态mcporter list如果输出里能看到12306这一项说明注册成功。此时 OpenClaw 已经具备调用 12306 查询能力的底层通道但还没有生成面向用户的 Skill。Skill 是更高一层的封装它定义了「用户说什么话、Agent 调哪个工具、参数怎么映射」。这里有个容易踩的坑mcporter.json 的路径必须是~/.mcporter/mcporter.json不是项目目录下的随便一个文件。OpenClaw 默认读用户主目录下的这个路径。如果你放错位置Agent 会报「找不到 MCP 服务」或者干脆不触发工具调用。另外如果你同时用 Cline MCP 或 Codex 的 auth.json 做其他实验注意它们的配置是独立的。Cline MCP 有自己的配置文件Codex 的 auth.json 管的是它自己的认证。这三者不要混在一起改否则排查时你会分不清是哪个工具在读哪份配置。统一原则是OpenClaw 走 mcporter.jsonCline 走它自己的 MCP 设置Codex 走 auth.json各管各的。4. 一句话生成 Skill 并验证真实查询结果配置就绪后进入最关键的一步对 OpenClaw 说一句话让它自动生成 Skill。原话可以就是帮我创建 12306 火车票查询 skillOpenClaw 收到这句话后内部会走三步。第一步是意图解析识别出你要创建一个 Skill功能是铁路票务查询需要绑定 12306 MCP需要定义参数模型。第二步是生成 Skill 定义它会产出一份类似下面的结构name: mcporter-railway-query description: 查询中国铁路12306高铁动车余票 tools: - name: get-tickets parameters: date: string fromStation: string toStation: string trainFilterFlags: string earliestStartTime: number latestStartTime: number这份 YAML 是自动生成的你不需要手写 JSON Schema。第三步是自动绑定 MCPOpenClaw 读取~/.mcporter/mcporter.json把 Skill 和 12306 MCP 服务关联起来。到这里Skill 已经实例化完成。接下来验证真实查询。继续对 OpenClaw 说查询 2 月 14 日上海到江阴下午的高铁动车余票OpenClaw 会自动解析日期、把城市名转成站点代码上海虹桥是 SHH江阴是 KYH、加上过滤条件trainFilterFlagsGD、earliestStartTime12、latestStartTime18。内部等价于执行mcporter call 12306.get-tickets \ date2026-02-14 \ fromStationSHH \ toStationKYH \ trainFilterFlagsGD \ earliestStartTime12 \ latestStartTime18但用户完全看不到这层 CLI。MCP 返回结构化数据比如{ trainNo: G7744, startTime: 14:59, arriveTime: 16:09, secondClass: 有 }OpenClaw 再把它转成自然语言输出类似「G7744 次 14:59 从上海虹桥出发16:09 到江阴二等座有票」这样的结果。这一步是 Agent 的核心价值结构化系统返回的数据经过语义理解变成人类可读的输出。验证成功的标志有三个一是 Agent 没有报工具调用错误二是返回结果里包含真实车次号和时刻三是自然语言描述和结构化数据一致。如果只返回「我无法查询」或者空结果说明 Skill 没绑定成功回到上一节检查 mcporter.json。如果你想把模型调用切到 TaoToken 的 Coding Plan 做长期编码和 Agent 调试可以在 https://taotoken.net/coding-plan 里开通然后把 OpenClaw 的模型配置指向同一个 Base URL。这样 Skill 生成、意图解析、结果润色都走统一通道日志集中排查方便。5. 常见报错排查401、local proxy failed 与 choices 读取失败链路跑起来之后最容易卡在几个固定报错上。这一节按真实错误信息对照排查。401 Unauthorized。这个几乎都是 Key 问题。检查三处一是OPENCLAW_MODEL_API_KEY是否填了完整的sk-开头字符串有没有多余空格二是 Key 是否在 TaoToken 控制台被禁用或额度耗尽三是请求的 endpoint 是不是https://taotoken.net/api如果你误写成带 UTM 的地址某些客户端会把查询参数带进签名导致校验失败。API 地址就是https://taotoken.net/api不带任何后缀参数。local proxy failed。这个报错通常出现在你本地配了代理类工具但代理没启动或端口不对。注意这里说的不是让你去用什么网络工具而是排查本机环境变量里有没有残留的HTTP_PROXY、HTTPS_PROXY指向一个已经关掉的本地端口。用下面命令检查env | grep -i proxy如果有输出且指向一个不存在的端口把它 unset 掉再重试。OpenClaw 和 mcporter 都不需要代理就能访问本地 Docker 服务和 TaoToken 的 API。reading choices 失败。这个报错说明模型返回的 JSON 里没有choices字段或者返回的根本不是预期结构。常见原因有三个一是 Model ID 填错了比如把claude-sonnet-4-20250514写成了别的名字服务端返回错误对象而不是正常响应二是请求体格式不对比如messages数组为空三是 Base URL 少了/v1路径。用第 2 节的 curl 命令先单独验证模型通道确认能拿到choices再回去跑 OpenClaw。OAuth 相关报错。如果你在用 Claude Code 或 Codex 做辅助调试可能会遇到 OAuth 认证失败。这类工具如果走的是账号登录态而不是 API Key配置方式和 OpenClaw 不同。建议统一用 API Key 方式接入 TaoTokenBase URL、Key、Model ID 三件套配齐避免混用登录态和 Key 导致认证冲突。MCP 服务连不上。报错可能是connection refused或SSE timeout。先确认 Docker 容器在跑docker ps | grep 12306如果没有输出说明容器没起来看日志docker logs 容器ID如果容器在跑但连不上检查端口是不是被占用或者 mcporter.json 里的 url 是不是写成了http://localhost:8080/sse而 Docker 绑定的是127.0.0.1。这两个在大多数系统上等价但某些容器网络配置下会有差异统一写127.0.0.1最稳。Skill 生成了但不触发工具调用。这说明模型理解了意图但没绑定到 MCP。检查 mcporter.json 的enabled是否为 true以及 OpenClaw 是否有权限读取~/.mcporter/目录。另外确认 Skill 定义里的 tool name 和 MCP 暴露的 tool name 一致比如都是get-tickets。6. 把链路用起来从查询验证到长期 Agent 工作流跑通一次查询只是起点。真正有价值的是把这套链路变成日常可用的 Agent 工作流。你可以把 12306 查询 Skill 和其他 MCP 服务组合起来比如加一个日历 MCP让 Agent 在你说「帮我看看下周去江阴的票」时自动推算日期或者加一个消息推送 MCP把余票结果直接发到你的常用工具里。如果你打算长期跑这类 Agent建议把模型调用固定到 TaoToken 的 Coding Plan地址是 https://taotoken.net/coding-plan 。它的定位是长期编码和 Agent 场景适合这种需要多轮模型调用、频繁调试 Skill 定义的工作流。开通后把 OpenClaw 的 Base URL 和 Key 统一过去日志和额度都在一个地方看。日常调试时养成两个习惯。一是每次改完 mcporter.json 或 Skill 定义先用mcporter list确认服务注册状态再发自然语言指令。二是模型通道出问题时先用 curl 打一次最小请求把「模型通道」和「MCP 通道」分开验证。这两条链路任何一条断了Agent 都会表现异常但报错信息往往只指向其中一条分开验证能省很多时间。最后说一个实用技巧OpenClaw 生成的 Skill 定义可以手动微调。自动生成的参数模型不一定完全贴合你的使用习惯比如你可能想默认只查高铁、默认时间段是下午。这些都可以在生成的 YAML 里改改完重新加载即可。自动生成解决的是「从零到一」手动微调解决的是「从一到好用」。两者结合才是这套链路真正顺手的地方。