Koskamo

Live Train Times MCP

An anonymous, read-only MCP server that provides current public transit information including live departures, stop searches, and journey planning across 267 cities in 33 countries. It supports tools such as get_departures, find_stops, search_places, plan_journey, and get_city_summary.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Live Train Times MCP logo, by TravelWhizWebAPICommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by TravelWhizWebAPI
You need:No API key or account is required.
MCP endpoint (Streamable HTTP)
https://livetraintimes.org/api/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 5 of 5 declare behavior hints · 3 of 5 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Retrieve live and scheduled train, tram, subway, and metro departures
  • Search for specific transit stops or places
  • Plan a journey between locations
  • Get a summary of transit coverage for a specific city

Source and maintenance

Community listingRegistry 0.1.0
Maintenance checked

Protocol and capabilities

Server
live-times-transit 2026.7.0
MCP protocol negotiated in check
2025-06-18
Tools
5 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Read-only public transit tools from Momego. Use plan_journey for step-by-step directions between named places. Add locality or country context when it is known. If plan_journey returns clarification_required, ask the user to choose from the candidates and retry with the selected Place ID. Convert requested departure or arrival times to ISO-8601 with an explicit timezone offset; clarify when the timezone is uncertain. Use search_places proactively for ambiguous place names, find_stops before get_departures when a stop ID is unknown, and get_city_summary for coverage and links.

Tools

5 advertised

get_departures — Get Stop Departures
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Return a Live Times departure board for a known canonical stop ID. Optionally filter by route pattern or by up to 5 destinations.

get_departures input schema
{
  "type": "object",
  "required": [
    "stop_id"
  ],
  "properties": {
    "locale": {
      "type": "string",
      "description": "Optional BCP-47 locale, for example en-GB or fr-FR."
    },
    "stop_id": {
      "type": "string",
      "description": "Canonical Live Times stop ID, for example s-gcpvj0duq5-waterloo."
    },
    "filter_by": {
      "enum": [
        "ROUTE_PATTERN",
        "DESTINATION"
      ],
      "type": "string",
      "description": "Optional filter type."
    },
    "filter_value": {
      "type": "string",
      "description": "Required with filter_by. For DESTINATION, use one canonical stop ID, region-<id>, or up to 5 comma-separated values."
    }
  },
  "additionalProperties": false
}
get_departures output schema
{
  "type": "object",
  "properties": {
    "body": true,
    "meta": {
      "type": "object",
      "additionalProperties": true
    },
    "stop": {
      "type": "object",
      "additionalProperties": true
    },
    "alerts": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "detail": {
      "type": "string"
    },
    "routes": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "status": {
      "type": "integer"
    },
    "message": {
      "type": "string"
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "frequency": {
      "anyOf": [
        {
          "enum": [
            "LESS_THAN_FIVE_MINUTES",
            "FIVE_MINUTES",
            "FIVE_TO_TEN_MINUTES",
            "TEN_MINUTES",
            "TEN_TO_FIFTEEN_MINUTES",
            "FIFTEEN_MINUTES",
            "TWENTY_MINUTES",
            "THIRTY_MINUTES",
            "FORTY_MINUTES"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "departures": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "last_updated_time": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_departures annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
find_stops — Find Stops
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Resolve a named place with Apple Maps when needed, then find nearby stops or stations so callers can pass a stop_id to get_departures. For ambiguous names, include near or country_code. If the user asks for a train, select a RAIL result.

find_stops input schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "lat",
        "lon"
      ]
    },
    {
      "required": [
        "near"
      ]
    },
    {
      "required": [
        "country_code"
      ]
    }
  ],
  "required": [
    "query"
  ],
  "properties": {
    "lat": {
      "type": "number",
      "maximum": 90,
      "minimum": -90,
      "description": "Optional latitude used instead of Apple Maps geocoding. Must be supplied with lon."
    },
    "lon": {
      "type": "number",
      "maximum": 180,
      "minimum": -180,
      "description": "Optional longitude used instead of Apple Maps geocoding. Must be supplied with lat."
    },
    "near": {
      "type": "string",
      "description": "Locality used to resolve the search origin, for example London, UK. Supply this or country_code when coordinates are unavailable."
    },
    "query": {
      "type": "string",
      "description": "Stop or station search text, for example London Waterloo or Basingstoke."
    },
    "locale": {
      "type": "string",
      "description": "Optional BCP-47 locale, for example en-GB or fr-FR."
    },
    "country_code": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Two-letter ISO country code used to constrain Apple Maps geocoding, for example GB."
    }
  },
  "additionalProperties": false
}
find_stops output schema
{
  "type": "object",
  "properties": {
    "body": true,
    "meta": {
      "type": "object",
      "additionalProperties": true
    },
    "detail": {
      "type": "string"
    },
    "routes": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "status": {
      "type": "integer"
    },
    "message": {
      "type": "string"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "resolved_place": {
      "type": "object",
      "additionalProperties": true
    },
    "last_updated_time": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
find_stops annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search_places — Search Place Suggestions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Return up to 5 Apple Maps place candidates with Momego place IDs. Use this proactively when an origin or destination name is ambiguous, then pass the selected place ID to plan_journey.

search_places input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "near": {
      "type": "string",
      "description": "Optional locality context, for example London, UK."
    },
    "limit": {
      "type": "integer",
      "default": 5,
      "maximum": 5,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "description": "Place, address, landmark, or station name."
    },
    "locale": {
      "type": "string",
      "description": "Optional BCP-47 locale, for example en-GB."
    },
    "country_code": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Optional two-letter ISO country code."
    }
  },
  "additionalProperties": false
}
search_places output schema
{
  "type": "object",
  "properties": {
    "body": true,
    "query": {
      "type": "string"
    },
    "detail": {
      "type": "string"
    },
    "status": {
      "type": "integer"
    },
    "message": {
      "type": "string"
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": false
}
search_places annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_journey — Plan a Journey
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Return compact step-by-step public transit directions between named places. Resolves names with Apple Maps and returns clarification candidates rather than guessing when a place is ambiguous.

plan_journey input schema
{
  "type": "object",
  "required": [
    "origin",
    "destination"
  ],
  "properties": {
    "mode": {
      "enum": [
        "FASTEST",
        "BUS_ONLY",
        "RAIL_ONLY",
        "SUBWAY_ONLY",
        "STEP_FREE",
        "LESS_WALKING",
        "DIRECT",
        "CYCLE_TRANSIT",
        "DRIVE_TRANSIT"
      ],
      "type": "string",
      "default": "FASTEST"
    },
    "locale": {
      "type": "string",
      "description": "Optional BCP-47 locale, for example en-GB."
    },
    "origin": {
      "type": "string",
      "description": "Origin place name, address, landmark, or station."
    },
    "arrive_by": {
      "type": "string",
      "description": "Optional ISO-8601 arrival datetime with explicit timezone offset. Do not combine with depart_at."
    },
    "depart_at": {
      "type": "string",
      "description": "Optional ISO-8601 departure datetime with explicit timezone offset. Do not combine with arrive_by."
    },
    "destination": {
      "type": "string",
      "description": "Destination place name, address, landmark, or station."
    },
    "num_results": {
      "type": "integer",
      "default": 3,
      "maximum": 5,
      "minimum": 1
    },
    "origin_near": {
      "type": "string",
      "description": "Optional locality context for the origin."
    },
    "origin_place_id": {
      "type": "string",
      "description": "Optional Momego place ID selected from a previous clarification result."
    },
    "destination_near": {
      "type": "string",
      "description": "Optional locality context for the destination."
    },
    "origin_country_code": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$"
    },
    "destination_place_id": {
      "type": "string",
      "description": "Optional Momego place ID selected from a previous clarification result."
    },
    "destination_country_code": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$"
    }
  },
  "additionalProperties": false
}
plan_journey output schema
{
  "type": "object",
  "properties": {
    "body": true,
    "detail": {
      "type": "string"
    },
    "status": {
      "anyOf": [
        {
          "enum": [
            "ok",
            "clarification_required"
          ],
          "type": "string"
        },
        {
          "type": "integer"
        }
      ]
    },
    "message": {
      "type": "string"
    },
    "journeys": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "resolved_origin": true,
    "last_updated_time": true,
    "origin_candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "resolved_destination": true,
    "destination_candidates": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": false
}
plan_journey annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_city_summary — Get City Summary
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Return Live Bus Times and Live Train Times coverage metadata and canonical links for a supported city.

get_city_summary input schema
{
  "type": "object",
  "required": [
    "city_id"
  ],
  "properties": {
    "locale": {
      "type": "string",
      "description": "Optional BCP-47 locale, for example en-GB or fr-FR."
    },
    "city_id": {
      "type": "string",
      "description": "Canonical city ID, for example gb-london."
    }
  },
  "additionalProperties": false
}
get_city_summary output schema
{
  "type": "object",
  "properties": {
    "body": true,
    "city": {
      "type": "object",
      "additionalProperties": true
    },
    "meta": {
      "type": "object",
      "additionalProperties": true
    },
    "urls": {
      "type": "object",
      "additionalProperties": true
    },
    "detail": {
      "type": "string"
    },
    "status": {
      "type": "integer"
    },
    "country": {
      "type": "object",
      "additionalProperties": true
    },
    "message": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_city_summary annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 1 of 1 checks answered
  2. 2026-11-09: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
400 ms
95th percentile latency
400 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 400 ms · metadata changed · 5 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http live-train-times-mcp https://livetraintimes.org/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add live-train-times-mcp --url https://livetraintimes.org/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable live-train-times-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "live-train-times-mcp": {
      "url": "https://livetraintimes.org/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "live-train-times-mcp": {
      "type": "streamableHttp",
      "url": "https://livetraintimes.org/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start live-train-times-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "live-train-times-mcp": {
      "type": "http",
      "url": "https://livetraintimes.org/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http live-train-times-mcp https://livetraintimes.org/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://livetraintimes.org/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "live-train-times-mcp": {
      "serverUrl": "https://livetraintimes.org/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Live Train Times MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.