A Home Assistant integration server providing MCP tools for device control, automation, weather, web search, and vision-based analysis. Built with FastAPI and LangChain, supporting both local and external MCP tool registration.
This server exhibits significant quality gaps across naming, descriptions, and schemas. While 12 of 16 tools have documented input schemas, descriptions are inconsistently detailed, parameter documentation is sparse, and output schemas are entirely absent. The server mixes Chinese and English language descriptions (e.g., tool 1, 15), which fragments clarity for LLM reasoning. Most tools lack the structural details required for reliable agent planning: parameter constraints are missing, error guidance is absent, and composition patterns are underdeveloped. This places the server squarely in the 'fair to poor' range typical of community implementations.
Tools (16)
automation_rule_createwritesource verified65/100
Create a new automation rule with trigger/condition/action. Requires two-step confirmation (draft creation, then execution).
Call Home Assistant service to control devices (turn on/off, set temperature, etc.). Performs parameter validation against entity schema and executes state readback verification.
Enum constraints missing for parameters accepting predefined values (format in fetch_webpage, domain in get_entities, service in call_service), LLM will hallucinate invalid options
Recommendations
Document output schemas for all 16 tools using JSON Schema, specify return type (string, object, array), field names, and field types. Example: fetch_webpage should return {type: 'object', properties: {content: {type: 'string'}, title: {type: 'string'}}, required: ['content']}.
Add enum constraints to all discrete-choice parameters: format in fetch_webpage → ['text', 'markdown']; domain in get_entities → ['light', 'climate', 'cover', 'switch', ...]; service in call_service → ['turn_on', 'turn_off', 'set_temperature', ...].
Replace bare 'object' typed parameters with documented structures: call_service.data should define valid service-specific fields; scheduled_task_create.action should specify {service: string, entity_id?: string, target?: object}; automation_rule_create trigger/condition/action should detail platform and platform-specific fields.
Add numeric range constraints to all numeric parameters: max_chars [1, 100000], tz_offset_hours [-12, 14], hours [1, 365], max_results [1, 100].
Translate all Chinese descriptions to English for universal LLM clarity. Examples: 'describe_state' → 'Query camera state snapshot at conversation start (read-only, non-realtime). Returns camera_opened=false if offline, must note absence of live video in responses, do not describe visual content.'; 'get_weather' → 'Fetch weather for specified city using Qweather API, cached 15 minutes. Location: city name (e.g. Shanghai) or coordinates (121.47,31.23).'
Add actionable error messages to tool descriptions guiding LLM recovery: 'If entity_id not found, call get_entities(domain=light) to discover available lights.'; 'If automation creation fails with invalid trigger, check ha_automation_create documentation for valid trigger platforms.'; 'If camera offline, describe_state will return camera_opened=false, inform user of unavailable video.'
Score history
Overall score trend
First recorded score · v2 rubric
60/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-23
C
60
2026-07-28+
v2
get_device_manualread onlysource verified72/100
Query detailed device information and custom notes for a specific device.
get_entitiesread onlysource verified72/100
Query Home Assistant entities (devices, automations, etc.). Returns filtered list based on domain, area, or name patterns.
get_weatherread only50/100
获取指定城市的天气信息。使用和风天气 API,15 分钟缓存。
ha_automation_createwritesource verified63/100
Create a Home Assistant automation directly (bypasses rule service abstraction). Requires two-step confirmation.
scene_activatewrite50/100
Activate a scene (preset state configuration for multiple devices).
scheduled_task_createwritesource verified65/100
Create a new scheduled task with cron expression and automation rule action.
scheduled_task_listread onlysource verified82/100
List all scheduled tasks with their cron expressions and next execution times.
vision_chatread onlysource verified72/100
Analyze camera frames with vision model. Returns description or answers questions about current visual state.
Mixed-language descriptions (Chinese + English) fragment clarity, describe_state, get_weather, current_time, scheduled_task_create use Chinese descriptions, limiting LLM reasoning in English-context deployments
Destructive operations lack confirmation or dry-run support (automation_rule_delete, automation_rule_create, ha_automation_create), agent can cause irreversible state changes without checkpoint
No error recovery guidance, tools lack actionable error messages telling LLM what to try next (e.g., 'entity not found, call get_entities() to discover valid IDs')
Parameter discovery gaps, camera_id, scene_id, rule_id, and entity_id parameters offer no hints on valid values; LLM must discover via separate tools (inefficient chaining)
Overlapping tool semantics (automation_rule_create vs ha_automation_create), LLM wastes reasoning cycles deciding between two similar tools; violates single-responsibility principle
No pagination support for potentially large result sets (get_entities, scheduled_task_list, device_history), large responses can exhaust context window
get_entitiesscheduled_task_listdevice_history
Implement confirmation/dry-run for destructive tools: automation_rule_delete should return a confirmation request (MRTR pattern) before actual deletion; call_service should support preview mode; automation_rule_create should use two-step confirmation mechanically (not just mentioned in description).
Merge automation_rule_create and ha_automation_create into a single tool with clear semantics, or document the distinction explicitly (e.g., one uses rule abstraction, other uses native HA YAML) so LLM can choose appropriately.
For identity parameters (entity_id, scene_id, camera_id, rule_id), provide discovery hints or add optional enum constraints in schema (if valid options are known at registration time).
Add format constraints to cron parameter: scheduled_task_create.cron should specify pattern or link: 'Cron expression (e.g. 0 9 * * * for daily 9 AM; see https://crontab.guru for syntax).'
Document cache behavior explicitly: get_weather should note '15-minute cache, repeated calls within 15 min return cached result' in description, so LLM doesn't expect fresh data.
For boolean-like parameters (e.g. overwrite in file operations, if implemented), ensure descriptions clarify consequences: 'true = replace existing; false = skip if exists (safe default).'
Add field chaining info to successful response descriptions: 'create_automation returns {automation_id, trigger, action} so LLM can immediately pass automation_id to other tools like delete or update.'