Skip to content

RailRoute journey planner

by railroute.in · remote · no sign-in to list tools · v1.3.0 · published by in.railroute

Plan intercity journeys in India by train, flight or both, with a fare for every travel class.

Final · 3Changes · 3

8 tools: 3 do something that can't be undone, 3 change things and 2 only read.

Scanned Oct 21, 2026

4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http journey-planner https://www.railroute.in/api/mcp

Findings

Matches of fixed checks, with the text they matched.

4 warn
  • The server marks "plan_journey" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for
  • The server marks "check_train_options" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":false,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for
  • The server marks "train_schedule" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "train_schedule" says "schedule": a word for a change.

    What this check looks for
  • The server marks "journey_calendar" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The input addresses people (input.to): what it sends cannot be taken back.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

8 tools

Can't be undone 3Claude Code: ask
  • check_train_optionsLive seat availability per class for one train on one date, plus every other way to book it when the through ticket will not confirm: a split at an intermediate station, boarding e…1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "check_train_options" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":false,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Live seat availability per class for one train on one date, plus every other way to book it when the through ticket will not confirm: a split at an intermediate station, boarding earlier, alighting later. This is the tool that rescues a waitlisted train. It spends a metered upstream call, so ask it about trains the traveller is actually considering rather than sweeping a list.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: true
  • journey_calendarDay-by-day service over a span of dates for a station pair: which days have a direct train and which have none, plus the weekly pattern.1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "journey_calendar" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Day-by-day service over a span of dates for a station pair: which days have a direct train and which have none, plus the weekly pattern. Use this when somebody is flexible about when they travel, or asks 'does it run on Sundays'. Timetable only — it says nothing about seats.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
  • plan_journeyEvery practical way to get from one place to another: direct trains with their fares per class, journeys with one change of train, flights, mixed train-and-flight itineraries, and …1 finding

    Why it is in this group

    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "plan_journey" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The input addresses people (input.to): what it sends cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Every practical way to get from one place to another: direct trains with their fares per class, journeys with one change of train, flights, mixed train-and-flight itineraries, and GOVERNMENT BUSES from the state road transport corporations, priced from their own reservation systems. This is the whole answer in one call. Place ids come from find_place. Use it for bus questions too. On a large share of the corridors these corporations serve there is no through train at all — Mysuru to Mangaluru runs twenty-five buses a day and not one direct train — so a journey this tool answers with a bus is often the only through service that exists, not a second-best. Pass `train_class` when the traveller has named one ("3A", "sleeper") and every train is priced in it; leave it out and each train is priced in every class we have evidence it carries. Pass `modes: "trains_only"` when they have said train — do not ask them to choose otherwise, because the point of this planner is that they do not have to. Pass `arrive_by: true` when they named a time they must BE somewhere rather than a time they want to leave.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
Changes things 3Claude Code: ask
  • nearby_stationsOther railway stations within a radius of one station, nearest first.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Other railway stations within a radius of one station, nearest first. Useful when a place has no service of its own and the traveller needs to know what is reachable — the planner already does this internally, so reach for it only when somebody asks the question directly.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
  • station_departuresEvery train scheduled to call at a station, in departure order — the enquiry board, not a journey plan.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Every train scheduled to call at a station, in departure order — the enquiry board, not a journey plan. Use plan_journey when somebody wants to get somewhere; use this when they are asking what leaves from here. Scheduled times only.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
  • train_scheduleEvery stop of one train with its scheduled arrival and departure, in order.1 finding

    Why it is in this group

    • The name "train_schedule" says "schedule": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "train_schedule" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "train_schedule" says "schedule": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Every stop of one train with its scheduled arrival and departure, in order. Scheduled times only — this says nothing about where the train is today.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
Only reads 2Claude Code: allow
  • find_placeTurn what somebody typed into RailRoute place ids.No findings

    Why it is in this group

    • The name "find_place" says "find": a word for reading.
    Description, as the server wrote it
    Turn what somebody typed into RailRoute place ids. ALWAYS call this before plan_journey. A place is a city with all of its stations and airports — Mumbai covers CSMT, LTT, Dadar, Bandra Terminus and the airport — so the planner can choose the right terminal rather than making the traveller do it. Typing a station code ("CSMT") finds the city and says which terminal matched.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
  • next_confirmed_dateSearch forward up to a month for the first date this route can actually be travelled with a confirmed berth — direct trains and one-change journeys together.No findings

    Why it is in this group

    • The description's first verb is "search": a word for reading.
    Description, as the server wrote it
    Search forward up to a month for the first date this route can actually be travelled with a confirmed berth — direct trains and one-change journeys together. Use it when a traveller is flexible about WHEN and the date they asked for is waitlisted. EXPENSIVE: it checks seats across dozens of trains and dates, so it is limited to a few calls an hour; for a single date use check_train_options instead.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http journey-planner https://www.railroute.in/api/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__journey-planner__find_place",
      "mcp__journey-planner__next_confirmed_date"
    ],
    "ask": [
      "mcp__journey-planner__plan_journey",
      "mcp__journey-planner__check_train_options",
      "mcp__journey-planner__train_schedule",
      "mcp__journey-planner__station_departures",
      "mcp__journey-planner__journey_calendar",
      "mcp__journey-planner__nearby_stations"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as journey-planner. Review it before you use it.