夜雨聆风学习资料网

ARTICLE · 1191383

AI 助手也能查火车票了:12306-mcp 接入指南

AI 助手也能查火车票了:12306-mcp 接入指南

每次准备坐火车,我都会经历一个固定流程:先想好日期,再查出发站和到达站,然后在一堆车次里筛选时间、车型和余票。要是没有直达,还得重新查中转方案。

这类事情不难,但很碎。

你当然可以直接问 AI :“帮我查一下明天北京到上海的高铁。”问题是,普通聊天模型并没有实时铁路票务数据。它能帮你规划思路,却不能凭空知道今天还有哪些车、哪个车次有票。

开源项目 12306-mcp 做的事情很直接:遵循 Model Context Protocol ( MCP )规范,把 12306 相关查询能力封装成大模型可以调用的工具。

它不是购票机器人,也不是官方客户端。它更像是给 AI 加了一组“铁路查询工具”,让模型在需要时调用接口,返回车次、时间、余票和中转信息。

12306-mcp 能查什么?

项目 README 目前列出了四类能力。

第一类是余票查询。给出出发日期、出发站和到达站后,服务可以查询对应车次,并返回车次、时间、席别和余票等信息。具体结果取决于实时接口和查询条件,文章里不虚构某一天的车次数据。

第二类是车次过滤。比如只看高铁动车,或者按照车次类型筛选。这样不用让 AI 把所有结果一股脑倒出来,先缩小范围,阅读体验会好很多。

第三类是途经站查询。确定一趟车之后,可以继续查它中间经过哪些站、到站时间、出发时间和停留时间。对于需要接站、估算行程,或者担心坐过站的人,这个功能挺实用。

第四类是中转查询。没有直达车时,可以指定中转站,让服务查询两段行程。比如“深圳到拉萨,西安中转”,大模型先识别城市,再调用中转工具拿结果。

项目文档还列出了车站编码查询工具。因为 12306 接口内部使用的是车站代码, AI 通常需要先把“北京”“上海虹桥”转换成对应编码,再发起车票查询。

这正是 MCP 工具链的一个特点:一个看似简单的问题,背后可能是几次工具调用。

MCP 在这里到底做了什么?

可以把 MCP 理解成一套让 AI 调用外部工具的约定。

用户说:“帮我查周五晚上从广州到长沙的高铁。”大模型先理解日期、城市和车次偏好,然后调用车站查询工具,拿到站点代码,再调用余票查询工具。结果返回后,模型负责整理成更容易看的答案。

流程大概是这样:

用户问题
  ↓
大模型理解日期、城市和筛选条件
  ↓
查询车站代码
  ↓
调用 get-tickets
  ↓
返回车次、时间、席别和余票

如果用户追加一句“没有直达就从武汉中转”,模型可以继续调用中转工具。要看某一趟车经过哪些站,则再调用经停站查询。

以前,开发者要为每个 AI 客户端单独写一套集成代码。现在,只要客户端支持 MCP ,服务端按照协议暴露工具,客户端就有机会直接接入。项目作者也提供了对应的 TypeScript 实现和 MCP SDK 依赖。

当然,协议统一不代表所有客户端的配置界面都一样。具体怎么添加 MCP Server ,仍然要看你使用的是哪一个客户端。

5 分钟接入:先用 npx 跑起来

项目 package.json 当前版本是 0.3.10,运行要求 Node.js 18 或更高版本。如果电脑上已经有 Node.js ,最简单的启动方式是:

npx-y12306-mcp

这个命令以 stdio 模式运行,适合由本地 MCP 客户端拉起进程。

如果你希望以 HTTP 方式启动,可以使用:

npx-y12306-mcp--port8080

端口号可以按你的环境调整。 HTTP 模式更适合单独启动服务,再让支持 HTTP MCP 的客户端连接。

以常见的 JSON 配置形式, stdio 模式大致可以写成:

{
"mcpServers": {
"12306-mcp": {
"command": "npx",
"args": ["-y", "12306-mcp"]
    }
  }
}

配置完成后,重新打开 MCP 客户端,检查工具列表里是否出现车站、余票、经停和中转相关工具。没有出现时,先看 Node.js 版本、 npx 是否可用,再检查客户端的 MCP 配置格式。

项目也提供 Docker 相关目录和配置。不过当前 README 对 Docker 启动命令的展示不完整,实际部署前建议直接以仓库最新文件为准,不要照抄一条未经确认的命令。

它适合做出行规划,不等于自动购票

这是最需要说清楚的边界。

12306-mcp 的定位是查询服务器。它可以帮 AI 获取车次和票务信息,但文章没有依据证明它能替用户完成登录、支付或购票。就算查询结果返回了余票,也不代表你下一秒提交订单时仍然有票。

票务数据会变化,日期和车站也很容易填错。尤其是“北京”“上海”这种城市名,往往对应多个车站。让 AI 规划路线时,最好明确说出“北京南”“上海虹桥”,并在真正出行前回到 12306 官方渠道确认一次。

我会把它用在三个地方:先帮我筛出可行车次;没有直达时快速找中转组合;确定车次后查看经停站。至于最终购票,还是自己确认。

从项目实现看,它会在启动时加载车站信息,再根据工具参数调用 12306 相关接口。这个设计挺适合拿来学习:一个真实的数据服务,经过车站编码、日期校验和参数处理,最后变成大模型可以理解的工具。

谁值得试试?

如果你只是偶尔查一次车票,直接打开 12306 官网或 App 更省事,不必为了一个查询任务专门配置 MCP 。

如果你已经在使用支持 MCP 的客户端,或者想学习“AI 如何调用真实 API”, 12306-mcp 是一个很直观的例子。它的功能边界明确,工具之间还有依赖关系,适合拿来观察 MCP Server 的基本结构。

开发者也可以顺着仓库里的 docs/principle.md 和 docs/architecture.md 继续看:车站数据怎样加载,基础工具怎样为核心查询提供参数,余票、中转和经停又怎样串起来。

项目地址: GitHub 搜索 Joooook/12306-mcp 即可找到仓库。

它能帮你少翻几次车次,但不能替你对行程负责。出发前,还是以 12306 官方页面的最终结果为准。

善忘是一种境界 | 学习 | 分享 | 创造美好生活 每日编程小知识 明天见。

相关学习资料