Production-ready, SOLID-oriented MCP server template with dynamic tool registration, dual transport (stdio + HTTP) and pluggable auth.
Three tools with complete input schemas and descriptions. Naming follows verb_noun pattern (get_*, plan_*). Descriptions are adequate (50-100 chars) but lack actionable context for LLM selection. All parameters have type definitions and descriptions. No output schemas documented. Error handling exists but recovery guidance is minimal. Tool composition is sound (single responsibility), but parameter descriptions could specify constraints more explicitly (e.g., days range 1-16 is in description but not as JSON Schema minumum/maximum).
Get the current weather conditions for a city (temperature, humidity, wind and sky condition).
Get a daily weather forecast for a city for the next N days (1-16), including high/low temperatures and precipitation chance.
Suggest what to wear given a city's current weather. Asks for your preferred units and activity before answering.
Output schemas not documented. LLMs cannot infer what fields to expect from tool responses, forcing them to guess at downstream field names and risk broken tool chains.
Parameter constraints (e.g., days 1-16 for get_forecast) stated only in description text, not in JSON Schema minumum/maximum. LLMs cannot parse natural-language constraints reliably.
plan_outfit description mentions 'Asks for your preferred units and activity before answering' but no input parameters for units or activity. Suggests multi-turn elicitation not reflected in schema.
Descriptions lack WHEN-to-use context. 'Get the current weather' is WHAT; missing is WHEN to call this vs plan_outfit, or what the LLM should do with the result.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
No error handling guidance in tool definitions. If city not found or API fails, LLM has no recovery path (e.g., 'try search_cities first').