Skip to main content
Glama

get-train-route-stations

Retrieve detailed stop information including stations, arrival/departure times, and dwell durations for specific train routes on China's railway network.

Instructions

查询特定列车车次在指定区间内的途径车站、到站时间、出发时间及停留时间等详细经停信息。当用户询问某趟具体列车的经停站时使用此接口。

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
trainCodeYes要查询的车次 `train_code`,例如"G1033"。
departDateYes列车出发的日期 (格式: yyyy-MM-dd)。如果用户提供的是相对日期,请务必先调用 `get-current-date` 解析。
formatNo返回结果格式,默认为text,建议使用text。可选标志:[text, json]text

Implementation Reference

  • The main handler function for the 'get-train-route-stations' tool. It searches for the train using the public API to get train_no, then queries the private 12306 API for route stations using cookies, parses the response data with parseRouteStationsInfo, formats it, and returns as text or JSON.
    async ({ trainCode, departDate, format }) => { const searchParams = new URLSearchParams({ keyword: trainCode, date: departDate.replaceAll('-', ''), }); const searchUrl = `${SEARCH_API_BASE}/search/v1/train/search`; const searchResponse = await make12306Request<TrainSearchResponse>( searchUrl, searchParams ); if ( searchResponse == null || searchResponse.data.length == 0 || searchResponse.data == undefined ) { return { content: [ { type: 'text', text: '很抱歉,未查询到对应车次。', }, ], }; } const searchData = searchResponse.data[0]; const queryParams = new URLSearchParams({ 'leftTicketDTO.train_no': searchData.train_no, 'leftTicketDTO.train_date': departDate, rand_code: '', }); const queryUrl = `${API_BASE}/otn/queryTrainInfo/query`; const cookies = await getCookie(); if (cookies == null || Object.entries(cookies).length === 0) { return { content: [ { type: 'text', text: 'Error: get cookie failed. Check your network.', }, ], }; } const queryResponse = await make12306Request<RouteQueryResponse>( queryUrl, queryParams, { Cookie: formatCookies(cookies) } ); if (queryResponse == null || queryResponse.data == undefined) { return { content: [ { type: 'text', text: 'Error: get train route stations failed. ', }, ], }; } const routeStationsInfo = parseRouteStationsInfo( queryResponse.data.data ); if (routeStationsInfo.length == 0) { return { content: [{ type: 'text', text: '未查询到相关车次信息。' }], }; } var formatedResult; switch (format) { case 'json': formatedResult = JSON.stringify(routeStationsInfo); break; default: formatedResult = formatRouteStationsInfo(routeStationsInfo); break; } return { content: [{ type: 'text', text: formatedResult }], }; }
  • Zod input schema for the tool parameters: trainCode (required string), departDate (required 10-char date string), format (optional 'text' or 'json').
    { trainCode: z .string() .describe('要查询的车次 `train_code`,例如"G1033"。'), departDate: z .string() .length(10) .describe( '列车出发的日期 (格式: yyyy-MM-dd)。如果用户提供的是相对日期,请务必先调用 `get-current-date` 解析。' ), format: z .string() .regex(/^(text|json)$/i) .default('text') .optional() .describe( '返回结果格式,默认为text,建议使用text。可选标志:[text, json]' ), },
  • src/index.ts:1386-1487 (registration)
    Registers the MCP tool 'get-train-route-stations' on the server instance with name, Chinese description, input schema, and inline handler function.
    server.tool( 'get-train-route-stations', '查询特定列车车次在指定区间内的途径车站、到站时间、出发时间及停留时间等详细经停信息。当用户询问某趟具体列车的经停站时使用此接口。', { trainCode: z .string() .describe('要查询的车次 `train_code`,例如"G1033"。'), departDate: z .string() .length(10) .describe( '列车出发的日期 (格式: yyyy-MM-dd)。如果用户提供的是相对日期,请务必先调用 `get-current-date` 解析。' ), format: z .string() .regex(/^(text|json)$/i) .default('text') .optional() .describe( '返回结果格式,默认为text,建议使用text。可选标志:[text, json]' ), }, async ({ trainCode, departDate, format }) => { const searchParams = new URLSearchParams({ keyword: trainCode, date: departDate.replaceAll('-', ''), }); const searchUrl = `${SEARCH_API_BASE}/search/v1/train/search`; const searchResponse = await make12306Request<TrainSearchResponse>( searchUrl, searchParams ); if ( searchResponse == null || searchResponse.data.length == 0 || searchResponse.data == undefined ) { return { content: [ { type: 'text', text: '很抱歉,未查询到对应车次。', }, ], }; } const searchData = searchResponse.data[0]; const queryParams = new URLSearchParams({ 'leftTicketDTO.train_no': searchData.train_no, 'leftTicketDTO.train_date': departDate, rand_code: '', }); const queryUrl = `${API_BASE}/otn/queryTrainInfo/query`; const cookies = await getCookie(); if (cookies == null || Object.entries(cookies).length === 0) { return { content: [ { type: 'text', text: 'Error: get cookie failed. Check your network.', }, ], }; } const queryResponse = await make12306Request<RouteQueryResponse>( queryUrl, queryParams, { Cookie: formatCookies(cookies) } ); if (queryResponse == null || queryResponse.data == undefined) { return { content: [ { type: 'text', text: 'Error: get train route stations failed. ', }, ], }; } const routeStationsInfo = parseRouteStationsInfo( queryResponse.data.data ); if (routeStationsInfo.length == 0) { return { content: [{ type: 'text', text: '未查询到相关车次信息。' }], }; } var formatedResult; switch (format) { case 'json': formatedResult = JSON.stringify(routeStationsInfo); break; default: formatedResult = formatRouteStationsInfo(routeStationsInfo); break; } return { content: [{ type: 'text', text: formatedResult }], }; } );
  • Helper function that transforms raw API RouteStationData array into formatted RouteStationInfo array, adding train class/service info to the first station.
    function parseRouteStationsInfo( routeStationsData: RouteStationData[] ): RouteStationInfo[] { const result: RouteStationInfo[] = []; routeStationsData.forEach((routeStationData, index) => { if (index == 0) { result.push({ train_class_name: routeStationData.train_class_name, service_type: routeStationData.service_type, end_station_name: routeStationData.end_station_name, station_name: routeStationData.station_name, station_train_code: routeStationData.station_train_code, arrive_time: routeStationData.arrive_time, start_time: routeStationData.start_time, lishi: routeStationData.running_time, arrive_day_str: routeStationData.arrive_day_str, }); } else { result.push({ station_name: routeStationData.station_name, station_train_code: routeStationData.station_train_code, arrive_time: routeStationData.arrive_time, start_time: routeStationData.start_time, lishi: routeStationData.running_time, arrive_day_str: routeStationData.arrive_day_str, }); } }); return result; }
  • Helper function that formats the RouteStationInfo array into a human-readable markdown table string showing train details, station sequence, times, and durations.
    function formatRouteStationsInfo( routeStationsInfo: RouteStationInfo[] ): string { let result = `${routeStationsInfo[0].station_train_code}次列车(${ routeStationsInfo[0].train_class_name } ${ routeStationsInfo[0].service_type == '0' ? '无空调' : '有空调' })\n站序|车站|车次|到达时间|出发时间|历时(hh:mm)\n`; routeStationsInfo.forEach((routeStationInfo, index) => { result += `${index + 1}|${routeStationInfo.station_name}|${ routeStationInfo.station_train_code }|${routeStationInfo.arrive_time}|${routeStationInfo.start_time}|${ routeStationInfo.arrive_day_str } ${routeStationInfo.lishi}\n`; }); return result; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Joooook/12306-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server