№ 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-key` request header
(alias `accountkey` also accepted). Own keys are **unlimited**.
- For try-before-you-commit, the server can be configured with a **demo key**
via the `LTA_DEMO_ACCOUNT_KEY` env 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


ChatForm
Tgmlabs