深入探索基于MCP协议的12306购票搜索服务器高效解决方案,打造智能化购票体验。
核心内容:
1. 12306-mcp项目功能特点及查询12306购票信息详解
2. 列车信息过滤与过站查询功能介绍
3. 技术架构解析与12306-MCP服务原理深度剖析

近期在GitHub上备受关注的一个开源项目——12306-mcp,基于Model Context Protocol(MCP)协议构建,专门为12306购票搜索服务器量身打造。
简单来说,该项目使大语言模型能够通过MCP接口直接查询12306的购票数据,从而显著提升整体购票体验与搜索效率。
12306-mcp核心功能亮点
实时查询12306购票信息:核心功能在于实时获取12306官方票务数据。后端与官方系统无缝对接,可完整返回车次、发车时间、到达时间、座位类型、票价等关键信息。
智能过滤列车信息:用户可根据出行计划,按出发地、目的地、出行日期、车次类型等条件灵活筛选结果,无需在大量车次中手动翻找。
便捷过站查询:想知道哪些列车途经某个特定站点?该功能非常实用。对于需要中途换乘或有特殊站点偏好的旅行者,只需输入站点名称,即可返回所有经过该站的车次列表。
智能中转查询:针对需要换乘的用户,系统根据出发地与目的地,结合各次列车时刻表,智能推荐最优中转方案,合理规划换乘行程。
项目技术架构与原理深度解析
技术架构设计
前后端分离架构:12306-mcp采用前后端分离设计。前端负责交互展示,后端处理业务逻辑、数据对接以及与12306官方系统的通信。这种架构让模块化开发和后期维护更加便捷,系统的可扩展性也得到显著增强。
12306-MCP服务运作原理
服务启动时,通过 getStations() 函数从12306 API获取全国车站信息,构建四个核心索引:
具体流程如下:
- 访问12306首页 (https://www.12306.cn/index/);
- 从HTML中提取车站名称JS文件路径;
- 下载并解析JS文件,获取原始车站数据;
- 补充缺失的车站信息 (MISSING_STATIONS);
- 基于车站数据得到四个核心数据结构映射表;
// 1. 车站id -> 车站信息 STATIONS: Record// "AAA": { // "station_id": "@aaa", // "station_name": "北京北", // "station_code": "AAA", // "station_pinyin": "beijingbei", // "station_short": "aaa", // "station_index": "0", // "code": "1234", // "city": "北京", // "r1": "", // "r2": "" // } // 2. 城市名 -> 车站id 和 站名 (可能一个城市多个站) CITY_STATIONS: Record // "北京": [{"station_code": "AAA","station_name": "北京北"},{"station_code": "BBB","station_name": "京东"},...] // 3. 车站名(与城市名相同,只会有一个) -> 车站id 和 站名 CITY_CODES: Record // "北京":{"station_code":"CCC","station_name":"北京"} // 4. 车站名 -> 车站id 和 站名 NAME_STATIONS: Record // "北京北":{"station_code":"AAA","station_name":"北京北"}
数据流程与工具关系详解
车票查询流程:
用户查询 "后天北京到上海的高铁" - 大模型调用流程:
↓
1. get-current-date() → "2024-01-15" (获取当前日期)
2. 大模型理解后天日期 → "2024-01-17"
3. get-station-code-of-citys("北京|上海") → {"北京": {"station_code": "BJP","station_name": "北京"}, "上海": {"station_code": "SHH","station_name": "上海"}}
↓
4. get-tickets(date: "2024-01-17", fromStation: "BJP", toStation: "SHH", trainFilterFlags: "G")
↓
5. 内部数据处理(参数验证, Cookie获取, API调用, 格式化输出文本)
↓
6. 返回格式化的高铁车次信息(车次、时间、价格、余票等)
中转查询流程:
用户查询 "深圳到拉萨,经过西安中转"
↓
1. 获取三个城市的车站id
2. get-interline-tickets(from: "SZQ", to: "LSO", transfer: "XAY")
↓
3. 内部数据处理(参数验证, Cookie获取, API调用, 格式化输出文本)
↓
4. 返回中转方案(第一程 + 第二程)
经停站查询流程:
用户查询 "G1次列车经停哪些站"
↓
1. get-train-route-stations(trainNo: "G1", from: "BJP", to: "SHH")
↓
2. 数据处理:parseRouteStationsData() → parseRouteStationsInfo()
↓
3. 返回经停站列表(站名、到达时间、出发时间、停留时间)
基础工具(Base Tool)
get-current-date: 获取上海时区当前日期
- 返回当前上海时区的时间日期字符串("yyyy-MM-dd")
- 为其他工具提供准确的查询日期基准
get-stations-code-in-city: 查询城市内所有车站(使用CITY_STATIONS)- 输入:中文城市名
- 查找:
CITY_STATIONS[city]获取该城市所有车站列表 - 返回:包含
station_code和station_name的数组 get-station-code-of-citys: 获取城市代表车站id(使用CITY_CODES)- 输入:城市名(支持 "|" 分隔的多个城市)
- 查找:
CITY_CODES[city]获取与城市同名的主要车站 - 返回:每个城市对应的代表车站信息
get-station-code-by-names: 车站名转车站id(使用NAME_STATIONS)- 输入:具体车站名(支持 "|" 分隔的多个车站)
- 查找:
NAME_STATIONS[stationName]精确匹配车站名 - 返回:车站id和车站名
get-station-by-telecode: 车站id查车站信息(使用STATIONS)- 输入:车站id
- 查找:
STATIONS[telecode]获取完整车站信息 - 返回:包含拼音、城市等详细信息
核心工具(Core Tool,输入可通过基础工具获取)
get-tickets: 查询12306余票信息
- 输入:出发日期、出发站id、到达站id、车次类型筛选
- 参数处理:检查日期不早于当前日期,验证车站id存在性, 构造请求入参
- Cookie 处理:先获取 12306 Cookie 用于身份验证
- API 调用:访问
/otn/leftTicket/query接口 - 数据处理, 车次类型筛选
- 返回格式化数据
get-interline-tickets: 中转换乘查询,支持指定中转站- 输入:出发站id、到达站id、中转站id、是否显示无座、车次类型筛选
- 参数处理:检查日期不早于当前日期,验证车站id存在性, 构造请求入参
- Cookie 处理:先获取 12306 Cookie 用于身份验证
- API 调用:访问
/lcquery/queryU接口 - 数据处理, 车次类型筛选
- 返回格式化数据
get-train-route-stations: 列车经停站查询- 输入:车次编码(可以调用get-tickets获取)、出发站id、到达站id、出发日期
- 参数处理:检查日期不早于当前日期,验证车站id存在性, 构造请求入参
- Cookie 处理:先获取 12306 Cookie 用于身份验证
- API 调用:访问
/otn/czxx/queryByTrainNo接口 - 返回格式化数据
12306-mcp安装配置指南
CLI 命令行启动
npm run build node ./build/index.js
MCP Server 配置
{
"mcpServers": {
"12306-mcp": {
"command": "npx",
"args": [
"-y",
"12306-mcp"
]
}
}
}
