npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

traintrack-mcp

v1.0.0

Published

MCP server for TrainTrack — Indian Railways train search, schedules, live status, station data, and PNR status for AI agents.

Readme

TrainTrack MCP

An MCP server for TrainTrack that gives AI agents access to Indian Railways train search, schedules, live status, trains between stations, station data, and PNR status.

It uses the MCP stdio transport, requires no API key, and talks to https://traintrack.stupidlabs.lol/ by default. TrainTrack uses unofficial NTES/Indian Railways data, which may occasionally be delayed, incomplete, or unavailable. Confirm time-sensitive journey details through official railway channels.

Requirements

  • Node.js 18 or newer
  • An MCP-compatible client

Installation

After the package is published:

npm install --global traintrack-mcp

To run it directly from a source checkout:

npm install
npm start

MCP client configuration

No environment variables are required for the hosted TrainTrack API.

Claude Desktop, Claude Code, Cline, and compatible clients

Add this to the client's MCP configuration:

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

Codex

Add this to ~/.codex/config.toml:

[mcp_servers.traintrack]
command = "npx"
args = ["-y", "traintrack-mcp"]
tool_timeout_sec = 60

OpenCode

Add this to ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "traintrack": {
      "type": "local",
      "command": ["npx", "-y", "traintrack-mcp"],
      "enabled": true
    }
  }
}

Configuration

| Environment variable | Default | Description | | --- | --- | --- | | TRAINTRACK_BASE_URL | https://traintrack.stupidlabs.lol | TrainTrack deployment to use. http and https URLs are supported, including deployments under a path. | | TRAINTRACK_TIMEOUT_MS | 30000 | Positive request timeout in milliseconds. |

For example:

{
  "mcpServers": {
    "traintrack": {
      "command": "npx",
      "args": ["-y", "traintrack-mcp"],
      "env": {
        "TRAINTRACK_BASE_URL": "https://trains.example.com/"
      }
    }
  }
}

Tools

| Tool | Inputs | What it returns | | --- | --- | --- | | search_trains | query | Trains matching a name, number, or text | | get_train_info | train_number | Train identity, endpoints, and running instances | | get_train_schedule | train_number, optional date | Scheduled stops, times, running days, and coordinates | | get_train_live_status | train_number, optional date | Live stops, delays, platforms, current reported position, and route geometry | | find_trains_between_stations | from, to, optional sort | Direct trains between two station codes | | get_train_exceptions | train_number | Exceptional service information such as cancellations or diversions | | get_pnr_status | pnr | Booking, passenger, train, and chart status | | get_station_coordinates | code | Bundled station name and coordinates | | search_stations | query, optional limit | Stations matching a name or code | | track_trains | train_numbers | Batched live tracking for up to 10 trains | | check_traintrack_health | none | Public API availability and service status |

Dates use DD-MMM-YYYY, for example 26-Jul-2026. Train numbers contain 4–6 digits, station codes contain 1–10 letters or digits, and a PNR contains exactly 10 digits.

Rate limits

TrainTrack applies these default limits per client IP and per endpoint. This MCP server does not add another rate limiter. An upstream 429 response is returned to the MCP client as a tool error with its HTTP status, response details, and X-Request-ID when available.

| Operation | Default upstream limit | | --- | ---: | | Train search | 60/minute | | Train information | 30/minute | | Train schedule | 20/minute | | Live train status | 12/minute | | Trains between stations | 20/minute | | Train exceptions | 20/minute | | PNR status | 2/minute | | Station coordinates | 120/minute | | Station search | 120/minute | | Batched live tracking | 6/minute | | Health check | 120/minute |

The hosted service also protects its railway-data provider from overload, so temporary 502 errors can occur even before a client endpoint limit is reached. Wait briefly before retrying a 429 or 502 response.

Cache and data freshness

Caching happens in TrainTrack, not in this MCP process. The MCP tools return the upstream response unchanged, including its cached field. A response with "cached": true came from an earlier identical request or was shared with a simultaneous identical request; it does not mean the data was just refreshed.

| Data | Maximum default cache window | | --- | ---: | | Live running status | 45 seconds | | Train exceptions/service updates | 5 minutes | | Train information | 30 minutes | | Current running instance | 30 minutes | | Trains between stations | 30 minutes | | Train search | 12 hours | | Train schedules | 12 hours |

PNR results are never stored in the result cache. Identical simultaneous PNR requests may still share one in-flight lookup. Treat PNRs as sensitive travel information and avoid putting real values in shared logs, screenshots, or telemetry.

See the hosted TrainTrack API documentation for the full API behavior.

Development

npm install
npm run check
npm test

The project uses ESM throughout and relies on Node's built-in Fetch API.

Author

Nitin Bansal (freakynit)[email protected]

License

MIT