A FastAPI and FastMCP-based weather server that provides current weather conditions and forecasts via the OpenWeatherMap API with SSE transport
Three tools with basic verb-noun naming (current_weather, hourly_forecast, daily_forecast). All have short descriptions (20-40 chars) and minimal parameter documentation. Input schemas present but lack depth: location is a bare string with no format/length constraints; hours/days parameters have defaults but no min/max bounds. No output schema documented. Error handling converts exceptions to ValueError but provides no recovery guidance. Tools return JSON strings rather than structured objects, forcing LLM parsing. No tool annotations (readOnlyHint, idempotentHint). Descriptions are too brief to guide LLM selection or explain when to use each tool vs alternatives.
Get current weather conditions for a location.
Get daily weather forecast for a location.
Get hourly weather forecast for a location.
Descriptions are 20-40 characters, below the 50-200 char baseline for LLM-optimized descriptions. 'Get current weather conditions for a location' lacks context on when to use this vs hourly_forecast or daily_forecast, and does not explain what fields are returned.
location parameter is a bare string with no format, length, or example constraints. LLMs cannot distinguish valid inputs (city name, lat/lon, postal code, IP address) from invalid ones. No description on the location parameter itself.
hours and days parameters lack min/max bounds. LLMs could pass 0, negative, or absurdly large values (e.g. 999999 hours). No description on these parameters to guide valid ranges.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 44 | <=2025-11-25 | v2 |
No output schema documented. Tools return JSON strings (json.dumps) rather than structured objects. LLMs must parse unstructured text, wasting tokens and risking extraction errors. No documentation of what fields (temperature, humidity, wind_speed, etc.) are in the response.
Error handling converts all exceptions to ValueError with str(e). No recovery guidance. LLM receives 'Invalid API key' or 'Location not found' with no hint on what to do next (retry, ask user, try search_locations, etc.).