A Model Context Protocol server for smart home device control integration with LLM-based AI agents. Provides device control tools for SwitchBot devices (TV, lights, air conditioners) and connects to LLM backends for natural language processing.
Significant quality gaps across all three tools. Tool definitions are loaded dynamically from YAML and JSON files (device_control_tools.ts), making it impossible to verify actual schema definitions in source code. The three visible tools (SwitchBotTVControlFunction, SwitchBotLightControlFunction, SwitchBotAirconControlFunction) have descriptions of adequate length (78-130 chars) but lack crucial parameter-level detail. Input schemas show types and basic descriptions but are incomplete: parameter descriptions are under 20 chars for critical fields (e.g., 'command' described only as 'Command value: ...'), making descriptions non-actionable for LLMs. No output schemas are documented. Tool naming violates verb_noun convention (should be control_switchbot_tv, not SwitchBotTVControlFunction). No error handling guidance or recovery paths. Tool definitions appear to be inferred from function class names rather than explicitly registered with complete schemas, triggering the inference penalty.
Controls SwitchBot-compatible air conditioner devices with power, mode, temperature setting and adjustment commands. Supports main, work, and bed room targets.
Controls SwitchBot-compatible light devices. Dynamically loaded from tooldef JSON files.
Controls SwitchBot-compatible TV devices. Dynamically loaded from tooldef JSON files.
Tool names do not follow verb_noun convention. Names like 'SwitchBotTVControlFunction' are PascalCase class names, not verb-prefixed tool names. Violates baseline: 90% of A+ tools start with action verb (get, create, update, control, etc.). LLMs cannot reliably infer intent from class names.
Tool definitions are dynamically loaded from external JSON/YAML files (device_control_tools.ts lines 8-19). Actual schema definitions are not visible in source code provided. Cannot verify parameter types, constraints, or output schemas. Per scoring rule: 'If you cannot see the actual tool definition in the source, cap that tool's overall at 50.' Capping at inference penalty.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 11 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Parameter descriptions are extremely terse and non-actionable. 'commandType' described only as 'Type of command: power, channel, or volume control' (54 chars), lacks guidance on when to use each. 'command' described as 'Command value: turnOn/turnOff/change...' (68 chars), does not explain valid ranges, dependencies, or error conditions. Baseline: average param annotation is 72 chars, but quality requires 10-50 word explanations of WHAT the param does and WHY.
No output schemas documented. Tools return JSON blobs with 'function_output' field (index.ts line 44) but no LLM-facing documentation of response structure. LLMs cannot plan downstream calls or extract relevant data.
No error handling guidance. CallToolRequestSchema handler (index.ts lines 35-48) catches errors but returns generic JSON with 'function_output' field. No recovery hints (e.g., 'Try adjusting temperature range to 22-28'), no error classification (retryable vs fatal), no actionable messages. Per pattern: 'Error responses must tell the LLM what to do next.'
Ambiguous parameter naming. 'commandTarget' used in light and aircon tools but 'commandType' in TV tool. No consistent naming scheme (should be command_type, target_location, etc.). Param 'command' is overloaded: accepts strings ('turnOn', 'turnOff', 'change'), numbers (channel IDs), and ranges (-3 to 3 for volume).
No enum constraints on string parameters. 'commandType' accepts 'power', 'channel', 'volume' but not enforced as enum. 'command' for power accepts 'turnOn', 'turnOff', 'change' but free-form strings allow hallucinated values. Enums are self-documenting.'
Undocumented parameter dependencies. For SwitchBotTVControlFunction, valid values for 'command' param depend on 'commandType' (channel number only valid if commandType='channel', -3 to 3 only if commandType='volume'). No documentation of these constraints.
No distinction between read and write semantics. All three tools are WRITE operations (control devices) but no indication in descriptions of side effects or irreversibility. Agents need to know which calls are safe to retry and which have irreversible consequences.'