An MCP server that provides weather information tools and resources, including current weather conditions, multi-day forecasts, and weather data by coordinates using the Open-Meteo API
Three tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. All tools have descriptions (10-60 chars, below the 50-200 char baseline for LLM optimization). Input schemas use Zod with type constraints (min/max for numbers), but parameter descriptions are minimal and output schemas are not documented. Error handling is generic ('Error: {error.message}') with no recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all being READ_ONLY. Tool names follow verb_noun pattern correctly (get_weather, get_forecast, get_weather_by_coordinates), but composition could be tighter, get_weather and get_weather_by_coordinates overlap in function.
Get a multi-day weather forecast for a city
Get current weather conditions for a city
Get current weather conditions for specific latitude and longitude coordinates
Tool descriptions are too short (10-60 chars vs. baseline 50-200 chars). 'Get current weather conditions for a city' lacks context on when to use this vs. get_weather_by_coordinates, what data is returned, or prerequisites.
Output schemas are not documented. Handlers return formatted strings or objects, but the LLM cannot see what fields to expect (e.g., does get_weather return temperature, humidity, wind_speed, or all three?). This forces the LLM to guess and wastes tokens parsing unstructured output.
Error handling is generic and non-actionable. Catch block returns 'Error: {error.message}' with no recovery guidance. If getCoordinates() fails with 'City not found', the LLM has no hint to try a different city name or call a search tool.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
No tool annotations despite all tools being READ_ONLY. Annotations (readOnlyHint: true) help agents understand safety and retry behavior. Missing annotations force the LLM to infer intent from the name alone.
Overlapping tool responsibilities. get_weather and get_weather_by_coordinates both return current weather, one by city name, one by coordinates. The LLM must reason about which to call. Consider a single get_weather tool that accepts either city OR (latitude, longitude).