Weather MCP server that exposes weather tools over the Open-Meteo adapter. Provides current weather conditions, daily forecasts, and day-specific recommendations for what to carry and watch out for.
Three well-named tools with strong, contextual descriptions (194 - 350 chars each). All parameters have types and descriptions. Input schemas are complete with proper JSON Schema. Error handling returns structured dicts with status/error fields. However, output schemas are documented only in docstrings, not in formal schema definitions. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all three being read-only. Missing pagination guidance for forecast results. Descriptions are LLM-optimized and include decision logic (umbrella/jacket rules), which is excellent for agent reasoning.
Get current observed weather conditions for a location. Use this for questions about right now ("what is it like outside in Denver"). For anything about later today or a future day, use get_forecast instead.
Decide what to carry and what to watch out for on a given day. This applies threshold logic to the forecast rather than returning it raw. Umbrella rule, two factors because probability alone is misleading. A 45 percent chance of 0.01 inches is a sprinkle; a 35 percent chance of half an inch soaks you. So the answer is "yes" when chance is at or above 50 percent, or when chance is at or above 30 percent AND expected accumulation is at least 0.10 inches. It is "maybe" when chance is at or above 30 percent with less accumulation than that, and "no" otherwise. If max wind is above 25 mph the recommendation switches to a rain jacket instead, because an umbrella inverts at that speed. Jacket rule: yes when the daytime high is below 62F, or when the overnight low is below 50F, which is the case that catches people out on evening plans. Advisories are raised for max wind above 30 mph, a daytime high above 95F, and any thunderstorm in the day's conditions.
Get a daily forecast for the next N days at a location. Day one of the returned list is today in the location's own timezone, not the caller's. Use this for planning questions spanning more than one day.
Output schemas not formally declared in tool registration. Docstrings document return structure, but MCP clients cannot parse docstrings to infer response shape. Clients cannot validate or structure responses without explicit schema definitions.
No tool annotations despite all three tools being read-only. FastMCP supports readOnlyHint via @mcp.tool(readOnly=True). Clients cannot determine safety without explicit hints, forcing conservative assumptions.
get_forecast returns unbounded list of daily forecasts. No pagination, limit, or offset parameters. Docstring mentions 'clamped to 1 through 16' but no formal constraint in schema. Large result sets risk context window exhaustion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Parameter 'date' in get_day_recommendation accepts null default but description says 'Defaults to today'. Null is ambiguous, should be explicit string 'today' or omitted entirely. LLMs may pass null when 'today' is intended.
Error messages are plain strings without structured error codes or categories. LLMs cannot distinguish retryable (network timeout) from user-fixable (invalid location) from fatal (API key expired) errors. No recovery guidance provided.