An MCP server that integrates weather, user profile, and device management tools with OpenAI's GPT-4o model using function calling
This server has basic tool definitions with schemas and descriptions present, but falls short of production quality. All three tools have input schemas with proper JSON Schema structure and non-empty descriptions. However, descriptions are minimal (10-50 chars), parameter descriptions lack depth, and critical issues exist: no output schemas documented, no error handling guidance, no tool annotations (readOnlyHint/destructiveHint), and the restart_device tool lacks any confirmation or dry-run mechanism despite being destructive. The tool_handlers implement HTTP calls to a backend but lack input validation, timeout handling, or actionable error messages. No pagination, no idempotency guarantees, and no recovery guidance. This is typical of early-stage integrations.
Fetch user profile by user ID
Get the current weather for a city
Restart a hardware device remotely
No output schemas documented. LLMs cannot plan downstream tool calls or extract required fields. Tool handlers return unstructured strings (e.g., 'response.json().get("weather_report", "No weather report available.")') with no schema contract.
Destructive tool (restart_device) lacks confirmation, dry-run, or permission gate. No mechanism to prevent accidental device restarts. Violates confirmation-request and permission-gate patterns.
Tool descriptions are too brief (10-50 chars). Descriptions lack WHEN to use, prerequisites, or state-modification warnings. 'Fetch user profile by user ID' does not explain what fields are returned or when to call it vs. other user tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
No error handling guidance in tool_handlers. HTTP errors (response.raise_for_status()) are not caught; failures return raw exceptions instead of actionable recovery messages. LLM receives no guidance on retry vs. user-fixable errors.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLM cannot distinguish safe reads from destructive writes without parsing descriptions. restart_device should be marked destructiveHint=true.