Singapore public-transport MCP server providing real-time bus arrivals, train alerts, carpark availability, location search, and multimodal routing via LTA DataMall and OneMap APIs
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 8 tools have clear action verbs and detailed parameter documentation. Descriptions average ~180 chars, within the 10-1024 baseline. All parameters include type definitions and descriptions. Output schemas are documented in descriptions. Error handling is present but could be more explicit about recovery paths. Tool composition is clean, each tool has a single responsibility. Main gaps: no explicit enum constraints for some parameters (e.g., lot_type in get_carpark_availability), and error responses lack actionable recovery guidance in some cases.
Find multimodal routes (public transport + walking) between two locations in Singapore. Accepts coordinates or place names. Returns up to 3 itineraries with duration, fare, transfer count, and detailed leg-by-leg instructions. Falls back to bus-only routing if PT service is unavailable.
Get real-time bus arrival times at a Singapore bus stop. Returns next 3 buses per service with ETA, GPS/scheduled flag, passenger load, bus type, accessibility, and destination terminal — so you can tell direction. Arrivals are AT the stop; do not infer intermediate stops. Use search_bus_stops first for a stop code, or to compare 2-3 nearby stops before picking one.
Real-time carpark lot availability (HDB, URA, LTA) in Singapore. Provide `area` for text search OR `latitude`+`longitude` for nearby carparks; geo search takes precedence. lot_type: C=car (default), Y=motorcycle, H=heavy vehicle. Geo mode sorts by distance; text mode sorts by available lots descending.
List all MRT/LRT stations in Singapore with their codes, lines, and coordinates. Use this to find station names and codes for context or to verify line information.
Get current train service alerts across Singapore's MRT/LRT network. Returns disruptions, delays, and advisories by line.
get_train_alerts has minimal description (only 'Get current train service alerts across Singapore's MRT/LRT network. Returns disruptions, delays, and advisories by line.'), lacks WHEN to use it, what fields are returned, and how to interpret results. Should explain output structure and typical use cases.
get_carpark_availability lot_type parameter accepts 'C', 'Y', 'H' but is defined as free-form string, not enum. LLMs may hallucinate invalid values like 'car' or 'motorcycle' instead of the required single-letter codes.
Error handling in api/errors.py defines typed exceptions (LTAAuthFailed, LTATimeout, etc.) but tool layer mapping to user-facing error messages is not visible in provided source. Cannot verify that errors include actionable recovery guidance (e.g., 'Try search_bus_stops() first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Search for a place by name in Singapore and return coordinates. Use this to convert place names (e.g., 'Marina Bay Sands', 'Changi Airport') into latitude/longitude for other tools.
Find addresses near given coordinates in Singapore. Returns up to 3 nearby addresses with building names, roads, postal codes, and exact coordinates.
Find Singapore bus stops by name/road or proximity to coordinates. Provide `query` for text search OR `latitude`+`longitude` for nearby stops; geo wins if both given. Returns stop code, description, road name, and (geo mode) distance. Use resolve_location first for place names. The nearest stop is not always best — check get_bus_arrivals at the top 2-3 stops and compare destination terminals before recommending.
find_route accepts place names OR 'latitude,longitude' strings but parameter description does not specify the exact format for coordinate input. LLMs may pass '40.7128, -74.0060' (with space) or other variants.
search_bus_stops and get_carpark_availability both accept optional query + lat/lon with 'geo wins if both given' but this mutual exclusivity is not formally documented in parameter descriptions. LLMs may not understand the precedence rule.