Skip to main content
Glama

get-train-route-stations

Retrieve detailed stop information for specific train routes, including stations, arrival/departure times, and duration at each stop between departure and arrival stations.

Instructions

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

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
trainNoYes要查询的实际车次编号 `train_no`,例如 "240000G10336",而非"G1033"。此编号通常可以从 `get-tickets` 的查询结果中获取,或者由用户直接提供。
fromStationTelecodeYes该列车行程的**出发站**的 `station_telecode` (3位字母编码`)。通常来自 `get-tickets` 结果中的 `telecode` 字段,或者通过 `get-station-code-by-name` 得到。
toStationTelecodeYes该列车行程的**到达站**的 `station_telecode` (3位字母编码)。通常来自 `get-tickets` 结果中的 `telecode` 字段,或者通过 `get-station-code-by-name` 得到。
departDateYes列车从 `fromStationTelecode` 指定的车站出发的日期 (格式: yyyy-MM-dd)。如果用户提供的是相对日期,请务必先调用 `get-current-date` 解析。

Implementation Reference

  • The core handler function that implements the tool logic. It makes an API request to 12306.cn for the train's route stations between specified from/to stations on the departure date, handles cookies, parses the response, and returns the list of stations with times.
    async ({
      trainNo: trainNo,
      fromStationTelecode,
      toStationTelecode,
      departDate,
    }) => {
      const queryParams = new URLSearchParams({
        train_no: trainNo,
        from_station_telecode: fromStationTelecode,
        to_station_telecode: toStationTelecode,
        depart_date: departDate,
      });
      const queryUrl = `${API_BASE}/otn/czxx/queryByTrainNo`;
      const cookies = await getCookie(API_BASE);
      if (cookies == null) {
        return {
          content: [{ type: 'text', text: 'Error: get cookie failed. ' }],
        };
      }
      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: '未查询到相关车次信息。' }],
        };
      }
      return {
        content: [{ type: 'text', text: JSON.stringify(routeStationsInfo) }],
      };
    }
  • Zod input schema defining the parameters for the tool: trainNo (internal train number), fromStationTelecode, toStationTelecode, and departDate.
    {
      trainNo: z
        .string()
        .describe(
          '要查询的实际车次编号 `train_no`,例如 "240000G10336",而非"G1033"。此编号通常可以从 `get-tickets` 的查询结果中获取,或者由用户直接提供。'
        ),
      fromStationTelecode: z
        .string()
        .describe(
          '该列车行程的**出发站**的 `station_telecode` (3位字母编码`)。通常来自 `get-tickets` 结果中的 `telecode` 字段,或者通过 `get-station-code-by-name` 得到。'
        ),
      toStationTelecode: z
        .string()
        .describe(
          '该列车行程的**到达站**的 `station_telecode` (3位字母编码)。通常来自 `get-tickets` 结果中的 `telecode` 字段,或者通过 `get-station-code-by-name` 得到。'
        ),
      departDate: z
        .string()
        .length(10)
        .describe(
          '列车从 `fromStationTelecode` 指定的车站出发的日期 (格式: yyyy-MM-dd)。如果用户提供的是相对日期,请务必先调用 `get-current-date` 解析。'
        ),
    },
  • src/index.ts:959-1027 (registration)
    Registers the 'get-train-route-stations' tool on the MCP server with name, description, input schema, and handler function.
    server.tool(
      'get-train-route-stations',
      '查询特定列车车次在指定区间内的途径车站、到站时间、出发时间及停留时间等详细经停信息。当用户询问某趟具体列车的经停站时使用此接口。',
      {
        trainNo: z
          .string()
          .describe(
            '要查询的实际车次编号 `train_no`,例如 "240000G10336",而非"G1033"。此编号通常可以从 `get-tickets` 的查询结果中获取,或者由用户直接提供。'
          ),
        fromStationTelecode: z
          .string()
          .describe(
            '该列车行程的**出发站**的 `station_telecode` (3位字母编码`)。通常来自 `get-tickets` 结果中的 `telecode` 字段,或者通过 `get-station-code-by-name` 得到。'
          ),
        toStationTelecode: z
          .string()
          .describe(
            '该列车行程的**到达站**的 `station_telecode` (3位字母编码)。通常来自 `get-tickets` 结果中的 `telecode` 字段,或者通过 `get-station-code-by-name` 得到。'
          ),
        departDate: z
          .string()
          .length(10)
          .describe(
            '列车从 `fromStationTelecode` 指定的车站出发的日期 (格式: yyyy-MM-dd)。如果用户提供的是相对日期,请务必先调用 `get-current-date` 解析。'
          ),
      },
      async ({
        trainNo: trainNo,
        fromStationTelecode,
        toStationTelecode,
        departDate,
      }) => {
        const queryParams = new URLSearchParams({
          train_no: trainNo,
          from_station_telecode: fromStationTelecode,
          to_station_telecode: toStationTelecode,
          depart_date: departDate,
        });
        const queryUrl = `${API_BASE}/otn/czxx/queryByTrainNo`;
        const cookies = await getCookie(API_BASE);
        if (cookies == null) {
          return {
            content: [{ type: 'text', text: 'Error: get cookie failed. ' }],
          };
        }
        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: '未查询到相关车次信息。' }],
          };
        }
        return {
          content: [{ type: 'text', text: JSON.stringify(routeStationsInfo) }],
        };
      }
    );
  • Helper function used by the handler to parse raw RouteStationData into user-friendly RouteStationInfo, handling the first station specially (using start_time as arrive_time).
    function parseRouteStationsInfo(
      routeStationsData: RouteStationData[]
    ): RouteStationInfo[] {
      const result: RouteStationInfo[] = [];
      routeStationsData.forEach((routeStationData, index) => {
        if (index == 0) {
          result.push({
            arrive_time: routeStationData.start_time,
            station_name: routeStationData.station_name,
            stopover_time: routeStationData.stopover_time,
            station_no: parseInt(routeStationData.station_no),
          });
        } else {
          result.push({
            arrive_time: routeStationData.arrive_time,
            station_name: routeStationData.station_name,
            stopover_time: routeStationData.stopover_time,
            station_no: parseInt(routeStationData.station_no),
          });
        }
      });
      return result;
    }
  • TypeScript type definition for the output RouteStationInfo used in the tool's response.
    export type RouteStationInfo = {
      arrive_time: string;
      station_name: string;
      stopover_time: string;
      station_no: number;
    };

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/freestylefly/12306-mcp'

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