MCP (Model Context Protocol) server for Kasa smart home devices
The server defines 6 tools with clear verb-based names and reasonable descriptions. All tools have proper JSON Schema input definitions with typed parameters and constraints. However, there are systematic gaps in parameter descriptions, missing output schemas, and no tool annotations. The server follows good naming conventions (discover_, get_, set_) and includes timeout parameters with sensible defaults. Parameter constraints like min/max for brightness (0-100) and color temperature (2500-9000) are present. The descriptions are adequate (avg ~100 chars) but lack actionable guidance for error recovery or when to use alternatives. No output schemas are documented, LLMs cannot see what fields to expect from responses. Error handling exists but is not visible in definitions.
Discover Kasa smart home devices on the local network via UDP broadcast
Get detailed information about a specific Kasa device
Get real-time energy usage statistics for smart plugs
Set brightness level for Kasa smart bulbs (0-100%)
Set color temperature for Kasa color bulbs
Turn a Kasa device on or off
No output schemas documented. LLMs cannot see what fields discover_devices, get_device_info, get_realtime_stats return, forcing trial-and-error field access and wasting tokens on inference.
Missing error recovery guidance in descriptions. No indication of what errors are retryable, when to retry vs. ask the user, or fallback actions. For example, set_brightness says nothing about what happens if the device doesn't support brightness control.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint declared. Agents cannot infer which tools are safe to retry (set_power_state is destructive; discover_devices is idempotent) without explicit metadata.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Ambiguous device targeting in get_device_info, set_power_state, set_brightness, set_color_temperature, get_realtime_stats. Both deviceId and host are optional via anyOf, but descriptions don't explain: (1) what a deviceId looks like vs. host, (2) which is preferred, (3) what happens if both are provided, (4) what happens if neither is provided.
deviceId and host parameters lack format descriptions. What does a deviceId look like? Is host a hostname or always an IP? LLMs need examples of valid formats to avoid passing malformed identifiers.
No dependency hints in descriptions. For example, set_power_state doesn't say 'Call discover_devices first if you don't have a deviceId.' This forces agents to reason about multi-step discovery workflows without guidance.