MCP server for Singapore bus arrival information using LTA DataMall API
The server provides 4 READ_ONLY tools for Singapore bus information with clear naming and reasonable descriptions. All tools start with appropriate action verbs (get_, search_). Most have documented input schemas using Zod validation. However, there are significant gaps: output schemas are not formally documented, error handling lacks recovery guidance, and several parameters lack descriptions or constraints. The code shows basic structure but falls short of production-grade patterns for composition, parameter constraints, and error guidance.
Get real-time bus arrival times for a specific bus stop in Singapore. Returns arrival times for all bus services at that stop, or filter by a specific bus service number.
Get the full route information for a specific bus service, including all bus stops along the route.
Get detailed information about a specific bus stop, including its name, road, and all bus services that stop there.
Search for bus stops by name, road name, or description. Returns bus stop codes and details.
No documented output schemas. Tools return text responses with formatting but LLM cannot parse structured fields. This violates pattern:tool-schema and forces LLMs to parse unstructured text, increasing token waste and error rates.
Error responses provide raw error text but no recovery guidance. A response like 'Error fetching bus arrivals: 401 Unauthorized' tells the LLM nothing about what to try next. Per pattern:recovery-guide, errors should include actionable next steps.
Input parameter constraints are missing or vague. service_no accepts 'NR1' or '15' but no regex, enum, or length bounds are declared. bus_stop_code is described as '5-digit' but no constraint enforces it (what if LLM passes '123456'?). Per pattern:constrained-input, free-form strings without enums invite hallucinated values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
No pagination or result limit documented. search_bus_stops and get_bus_routes do not expose pagination parameters or indicate how many results are returned. If a search matches 500 stops, is the LLM given all 500? Per pattern:paginated-result, large result sets must be limited and paginated.
Tool descriptions include example values ('NR1', '15', 'Orchard') which LLMs tend to reuse literally. Per pattern:tool-description best practice, examples should be replaced with formal constraints (enums, patterns).