A Cloudflare Workers-based MCP server that provides weather data and forecasts via OpenWeatherMap API
Server defines 6 weather tools with basic schemas and descriptions. All tools have names starting with action verbs (get_, compare_) and descriptions present. However, parameter descriptions are minimal or absent, most params lack detail on format, constraints, or when to use them. Output schemas are not documented. Error handling is present but generic ('error: data.message'). No tool annotations (readOnlyHint, etc.). Composition is reasonable (each tool does one thing), but descriptions fall short of LLM-optimization standards (avg ~60 chars, below 194-char baseline). No pagination support despite forecast/comparison tools returning multiple items.
Compares current weather between multiple cities (max 5 cities)
Fetches current air quality index (AQI) for the specified city
Fetches detailed weather including feels like, humidity, wind, pressure, and sunrise/sunset times
Fetches 5-day weather forecast for the specified city
Fetches current weather for the specified city
Fetches weather alerts and warnings for the specified city (One Call API required)
Parameter descriptions missing or trivial. 'city' param in all tools lacks format guidance (e.g., 'City name (e.g., London, New York). Partial names may fail.'). LLMs cannot infer valid input without explicit constraints.
Output schemas not documented. Callers cannot predict response structure (e.g., does getWeather return 'temp' or 'temperature'? Does compareWeather return an array or object?). LLMs must guess or infer from code.
No pagination support. getForecast and compareWeather return unbounded lists (5-day forecast, up to 5 cities). No limit, offset, or cursor parameters. Large results risk context window exhaustion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error responses are generic ('error: data.message'). No recovery guidance. If a city is not found, the LLM receives 'City not found' with no suggestion to try a partial name or alternative spelling.
No tool annotations. All tools are read-only but lack readOnlyHint annotation. Agents cannot distinguish safe tools from destructive ones without parsing descriptions.