№ 0903Skill
SG Bus + Train connector for Muse
MCP server built for the Muse connector directory that answers Singapore bus arrival times and MRT/LRT service questions using the official LTA DataMall API.
🚌🚇 SG Bus + Train — a Muse connector
Real-time Singapore bus arrival times and MRT/LRT service info as an MCP
server, powered by the official LTA DataMall API. Ask in plain language:
"When is the next bus 96 at stop 83139?"
"Which buses stop at Buona Vista?"
"Is the next bus 151 wheelchair accessible?"
"What buses are near me?"
"Is the MRT disrupted right now?"
"How crowded is Dhoby Ghaut station?"
"Which stations are on the Circle Line?"
Built for submission to the Meta Muse connector directory (muse.ai/platform).
How it works
Muse ──MCP (streamable HTTP)──▶ this server ──HTTPS──▶ LTA DataMall API
│ ▲
└─ forwards YOUR key ────┘
Auth model (per-user keys, with a demo fallback)
This connector uses API keys auth:
- Each end user ideally brings their own free LTA DataMall API key (from
https://datamall.lta.gov.sg — sign up, free). - The user saves the key in Muse as the
x-lta-account-keyrequest header
(aliasaccountkeyalso accepted). Own keys are unlimited. - For try-before-you-commit, the server can be configured with a demo key
via theLTA_DEMO_ACCOUNT_KEYenv var (the developer's own key, shared
quota). Callers without their own key fall back to it, rate-limited to
10 calls per client IP per day (in-memory). When the budget is exhausted
they get a friendly error pointing at the free key signup. - The server never stores any key — yours or the demo one — and never logs keys.
Tools (all read-only)
| Tool | What it does |
|---|---|
bus_arrivals(bus_stop_code) |
Next 3 buses per service at a 5-digit stop code: minutes until arrival, crowding in plain words (seats / standing / limited standing), wheelchair accessibility, single/double deck. Each bus is tagged with its terminating stop, resolved from LTA's per-vehicle destination code. |
find_bus_stops(query) |
Case-insensitive search over stop names and roads. Served from the bundled stop list (see below) — instant, no LTA call. |
nearby_bus_stops(latitude, longitude, max_results=5, radius_m=500) |
Stops near a location (haversine distance), nearest first, with distance in metres. Served from the bundled stop list. Enables a "buses near me" flow: resolve the user's location → this tool → `bus_arrivals |



