An MCP server built with C# and .NET that provides weather tools with JWT-based authentication. Includes a Semantic Kernel handoff agent client for orchestrating multi-agent conversations.
The server implements 2 weather tools with basic name clarity and functional parameter schemas. Both tools have appropriate descriptions and input parameters with types and descriptions. However, critical gaps exist: no output schemas are documented, no error handling guidance is provided, no parameter constraints (enums, ranges) are enforced or documented, and no idempotency or destructive-operation guidance is present. Tool names follow verb_noun convention (GetAlerts, GetForecast) but are PascalCase rather than snake_case (get_alerts, get_forecast), which is inconsistent with LLM-friendly naming conventions. Parameter descriptions are minimal (20-40 chars) and lack constraint details (e.g., latitude/longitude ranges, state code format validation). The tools return string responses rather than structured JSON, forcing LLMs to parse text. Overall, the definitions are functional but lack the completeness expected of production-grade tools.
Get weather alerts for a US state.
Get weather forecast for a location.
No output schema documentation. Tools return plain strings instead of structured JSON. LLMs cannot parse alerts or forecast details reliably and must extract data via text parsing, which is error-prone and wastes tokens.
Parameter descriptions lack constraint details. 'state' parameter does not document accepted format (2-letter abbreviation), valid range, or what happens with invalid input. 'latitude' and 'longitude' lack range constraints (e.g., -90 to 90 for latitude).
No error handling guidance. Exceptions are thrown (McpException) but no recovery steps are provided to the LLM. GetAlerts/GetForecast lack descriptions of failure modes (invalid state code, API unavailable, no forecast data) and what the LLM should do next.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Tool names use PascalCase (GetAlerts, GetForecast) instead of snake_case convention (get_alerts, get_forecast). While C# class naming is PascalCase, MCP tool names should follow the snake_case convention for LLM compatibility and consistency with industry standards.
No idempotency or side-effect guidance. Both tools are read-only (Risk: READ_ONLY) but the descriptions do not explicitly state this, which helps LLMs understand retry safety.
String responses instead of structured objects. GetAlerts returns multi-line text with embedded '--' separators; GetForecast returns multi-line text with embedded '---' separators. LLMs cannot reliably extract individual alerts or forecast periods without natural language parsing.