Weather MCP Server that provides weather alerts and forecasts using the National Weather Service API
The weather server defines 2 tools with basic structure but significant quality gaps. Both tools have descriptions and schemas, but descriptions are minimal (18-28 chars, well below the 194-char baseline). Parameters lack meaningful descriptions, 'state' says 'Two-letter state code (e.g. CA, NY)' which includes a discouraged example; 'latitude' and 'longitude' descriptions are truncated in the source and appear incomplete. No documented output schemas, no error handling guidance, no pagination support despite weather alerts potentially returning large result sets. Tool definitions are directly visible in server/src/index.ts via server.tool() registration, so they are not inferred. The code uses Zod schemas with basic validation (e.g., z.string().length(2)), which is good, but no enums, no min/max bounds for lat/long are enforced in the visible schema definitions. Error responses are plain text with no recovery guidance (e.g., 'Failed to retrieve alerts data' tells the LLM nothing). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite both being read-only operations. No composition risk, tools are single-purpose. Overall: structurally present but minimal in detail.
Get weather alerts for a state
Get weather forecast for a location
Tool descriptions far too short (18-28 chars vs 194-char baseline). Descriptions must explain WHAT the tool does, WHEN to use it, and any prerequisites. Current descriptions provide minimal signal for LLM selection.
No output schema documented. LLMs cannot plan downstream operations without knowing what fields are returned (e.g., does get-alerts return alert_id, severity, expiration time? does get-forecast return hourly vs daily periods?). Output schemas are REQUIRED for A+ tools.
Parameter descriptions include example values ('e.g. CA, NY') which LLMs tend to reuse literally. Use enum constraints or regex patterns instead. For lat/long, no visible min/max enforcement, Zod schema has bounds but param description is truncated and incomplete.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 41 | - | v1 |
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Both tools are read-only and safe to retry, but this is not explicitly declared in the schema, forcing LLMs to infer.
No error guidance or recovery paths. Error response 'Failed to retrieve alerts data' provides no context, is this retryable? Should the user provide different input? Should they call a different tool? Per pattern:recovery-guide, errors must tell the LLM what to do next.
No pagination support documented. get-alerts can return potentially large result sets (all active alerts for a state). No limit parameter, no offset/cursor, no total count. Large untruncated results risk exhausting context window.