Skip to main content
Glama
hekmon8

Home Assistant MCP Server

by hekmon8

get_state

Retrieve the current status of any Home Assistant entity, such as lights or sensors, to monitor device states and conditions.

Instructions

Get the current state of a Home Assistant entity

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
entity_idYesThe entity ID to get state for (e.g., light.living_room)

Implementation Reference

  • The getEntityState method implements the core logic for the 'get_state' tool. It validates the entity_id parameter, queries the Home Assistant API for the entity's state, and returns the response as a formatted JSON text block.
    private async getEntityState(args: any) {
      if (!args.entity_id) {
        throw new McpError(ErrorCode.InvalidParams, 'entity_id is required');
      }
    
      const response = await this.haClient.get(`/api/states/${args.entity_id}`);
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify(response.data, null, 2),
          },
        ],
      };
    }
  • Defines the schema for the 'get_state' tool, including name, description, and input schema requiring 'entity_id'.
    {
      name: 'get_state',
      description: 'Get the current state of a Home Assistant entity',
      inputSchema: {
        type: 'object',
        properties: {
          entity_id: {
            type: 'string',
            description: 'The entity ID to get state for (e.g., light.living_room)',
          },
        },
        required: ['entity_id'],
      },
    },
  • src/index.ts:122-123 (registration)
    Registers the 'get_state' tool in the CallToolRequestSchema handler by dispatching to the getEntityState method.
    case 'get_state':
      return await this.getEntityState(request.params.arguments);
  • src/index.ts:54-117 (registration)
    Registers the 'get_state' tool in the ListToolsRequestSchema handler for tool discovery.
    this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
      tools: [
        {
          name: 'get_state',
          description: 'Get the current state of a Home Assistant entity',
          inputSchema: {
            type: 'object',
            properties: {
              entity_id: {
                type: 'string',
                description: 'The entity ID to get state for (e.g., light.living_room)',
              },
            },
            required: ['entity_id'],
          },
        },
        {
          name: 'toggle_entity',
          description: 'Toggle a Home Assistant entity on/off',
          inputSchema: {
            type: 'object',
            properties: {
              entity_id: {
                type: 'string',
                description: 'The entity ID to toggle (e.g., switch.bedroom)',
              },
              state: {
                type: 'string',
                description: 'The desired state (on/off)',
                enum: ['on', 'off'],
              },
            },
            required: ['entity_id', 'state'],
          },
        },
        {
          name: 'trigger_automation',
          description: 'Trigger a Home Assistant automation',
          inputSchema: {
            type: 'object',
            properties: {
              automation_id: {
                type: 'string',
                description: 'The automation ID to trigger (e.g., automation.morning_routine)',
              },
            },
            required: ['automation_id'],
          },
        },
        {
          name: 'list_entities',
          description: 'List all available entities in Home Assistant',
          inputSchema: {
            type: 'object',
            properties: {
              domain: {
                type: 'string',
                description: 'Optional domain filter (e.g., light, switch, automation)',
              },
            },
          },
        },
      ],
    }));
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states this is a 'Get' operation, implying read-only behavior, but doesn't clarify if it requires authentication, has rate limits, returns error states, or what the output format might be (e.g., JSON with state attributes). For a tool with zero annotation coverage, this leaves significant gaps in understanding how it behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core action ('Get the current state'). There is zero waste—every word contributes directly to understanding the tool's purpose without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 parameter, 100% schema coverage) but lack of annotations and output schema, the description is incomplete. It doesn't address what the tool returns (e.g., state value, attributes, timestamps) or potential errors, which is critical for a read operation in a home automation context. The description alone is insufficient for full agent understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, with the 'entity_id' parameter fully documented in the schema. The description adds no additional meaning beyond what the schema provides (e.g., no examples beyond the schema's 'light.living_room', no context on entity ID formats). Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('current state of a Home Assistant entity'), making the purpose immediately understandable. It doesn't explicitly differentiate from siblings like 'list_entities' (which likely lists entities rather than getting state) or 'toggle_entity' (which changes state), but the specificity of 'current state' provides some implicit distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'list_entities' or 'toggle_entity'. It doesn't mention prerequisites (e.g., needing a valid entity ID) or exclusions (e.g., not for modifying state). Usage is implied by the action but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hekmon8/Homeassistant-server-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server