MCP server for retrieving Malaysian weather data including forecasts, warnings, earthquakes, and water level conditions from the Malaysia Government API
The weather-server defines 4 tools with mixed quality. All tools have descriptions and input schemas visible in weather.py, but several gaps limit effectiveness. Naming follows verb_noun convention (get_*), which is good. However, descriptions lack specificity about prerequisites, dependencies, and error recovery. Parameters have type definitions (string) and descriptions, but lack enums, format constraints, and validation guidance. Output schemas are not documented, the code uses formatter helper functions (format_weather, format_earthquake_data, etc.) that return free-form strings, not structured objects. Error handling is minimal: the make_api_request helper returns None on failure with no actionable guidance. Parameters like 'district' and 'state' in get_water_level_condition lack mutual-exclusivity documentation. Defaults are reasonable (empty strings) but not optimized. The server does not expose secrets as parameters (good), but lacks audit logging and detailed permission scoping. Overall, this is a fair-to-poor community server with workable definitions but significant gaps in LLM-optimization and error guidance.
Fetch earthquake news for a given location within a specified date range.
Retrieve general weather warnings issued within a specified date range.
Retrieve the water level conditions associated with flood warnings for a specified district or state. If both district and state are provided, the district takes precedence. If district or state is not specified, use an empty string for that field.
Retrieve a weather forecast for a specific location within a given date range.
No documented output schemas. Tools return formatted strings (via format_water_level, format_weather, etc.) instead of structured objects with typed fields. LLMs cannot plan downstream operations or extract specific fields from free-form text.
Parameter constraints not enumerated. 'district' and 'state' in get_water_level_condition accept free-form strings with no enum, validation rules, or examples. The description notes 'district takes precedence' but does not clarify the expected format (e.g., 'Kuala Lumpur District' vs 'KL').
Date/datetime parameters lack format validation guidance. 'datetime_start' and 'datetime_end' specify format '<YYYY-MM-DD HH:mm:ss>' in descriptions, but no explicit validation rules, error handling, or guidance on what happens if the format is wrong (e.g., does the API silently ignore invalid dates?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 40 | - | v1 |
Error handling returns None with no recovery guidance. The make_api_request helper catches exceptions and returns None, but the tools do not explain to the LLM what went wrong or what to do next (retry? check connectivity? contact admin?).
No pagination support. Tools do not accept limit, offset, or cursor parameters, and do not document result limits. If an API returns hundreds of warnings or earthquake records, the entire list is formatted as a single string, exhausting context.
Descriptions are functional but lack LLM-selection context. They explain WHAT the tool does but not WHEN to use it or how it differs from related tools. For example, get_warning vs get_weather_forecast, when would an LLM choose one over the other?