Probado con Home Assistant 2026.10.0 · MCP Python SDK 2.3.0 · Docker · verificado

Home Assistant 2026.10 convierte tu casa en un servidor MCP con un solo clic: en Ajustes > Sistema > IA aparece una tarjeta que activa el servidor y te da la URL que pegas en tu agente. Lo he montado en Docker el 7 de octubre de 2026 con la beta 2026.10.0b4 y lo he conectado con el SDK de Python de MCP y con Claude Code. El 9 de octubre repetí la prueba con la versión estable 2026.10.0 y el resultado fue el mismo: 28 herramientas, el mismo servidor MCP y las mismas entidades expuestas. Aquí tienes los pasos, lo que el agente ve de tu casa y lo que conviene limitar. También hay una versión en inglés de esta guía.

Puntos clave

  • La página Tareas de IA pasa a llamarse IA y gana una tarjeta Model Context Protocol que activa el servidor y lista las URL /api/mcp y /api/mcp/assist con un botón para copiarlas.
  • Una instalación nueva expone todas las API de LLM, también las que se añadan después, y solo deja conectar a cuentas de administrador. Ambas opciones se cambian sin borrar la integración.
  • En mi laboratorio, el servidor ofreció 28 herramientas y su contexto en vivo describía 45 de las 122 entidades de la demo: las cerraduras, cámaras y alarmas no estaban expuestas.
  • Encender una luz con la herramienta intent__HassTurnOn tardó 12 ms; pedir la cerradura de la puerta devolvió un error de entidad no expuesta.
  • El servidor negoció la revisión 2025-11-25 del protocolo, porque Home Assistant usa todavía el SDK de Python 1.28.1. Un cliente del SDK 2 se conecta sin tocar nada.

Qué cambia en Home Assistant 2026.10 con MCP

Home Assistant ya podía actuar como servidor MCP desde la 2025.2, pero activarlo exigía tres pasos sueltos. La 2026.10 los junta en una tarjeta.

El Model Context Protocol (MCP) es el protocolo con el que una aplicación de IA descubre y llama herramientas de otros programas. Antes había que añadir la integración, elegir qué partes de la casa exponer y averiguar qué URL dar al agente. Las notas de la versión, firmadas por Franck Nijhof, lo resumen así: "New setups expose everything Home Assistant has to offer, including anything added later, and only allow administrator accounts to connect."

Los cambios que notas al usarlo son cuatro:

  • Tarjeta Model Context Protocol en Ajustes > Sistema > IA, con el servidor activable en un clic
  • Dos opciones nuevas en la integración: all_llm_apis (exponer todas las API de LLM) y require_admin (exigir cuenta de administrador), las dos activadas por defecto
  • Rutas por API: /api/mcp sirve todas las API habilitadas y /api/mcp/assist solo la de Assist
  • Descubrimiento inverso: la integración cliente de MCP detecta las aplicaciones que publican su propio servidor MCP y solo pide confirmación

Las instalaciones que ya tenían la integración conservan su comportamiento: las dos opciones nuevas quedan desactivadas para no romper a los clientes existentes.

Cómo levantar Home Assistant 2026.10 en Docker

Para probarlo basta un contenedor con un volumen para /config. Si ya tienes Home Assistant en marcha, la guía para instalar Home Assistant con Docker explica la red y los permisos; aquí uso un puerto propio para no chocar con otra instancia.

services:
  homeassistant:
    image: ghcr.io/home-assistant/home-assistant:2026.10.0
    container_name: homeassistant
    ports:
      - "8123:8123"
    volumes:
      - ./config:/config
    environment:
      - TZ=Europe/Madrid
    restart: unless-stopped

Levanta el contenedor con docker compose up -d y completa el asistente inicial en http://localhost:8123. En mi prueba añadí demo: a configuration.yaml para tener luces, persianas, termostatos y cerraduras falsas: tras reiniciar, la instancia tenía 122 entidades.

Cómo activar el servidor MCP en un clic

Entra en Ajustes > Sistema > IA y pulsa el interruptor de la tarjeta Model Context Protocol. La tarjeta muestra dos URL: Tu API del MCP (/api/mcp) y, bajo API individuales del MCP, la de Assist (/api/mcp/assist).

Por debajo, ese clic crea la integración Model Context Protocol Server con el título "All LLM APIs". Lo comprobé lanzando el mismo flujo por la API REST: el formulario de alta ya no pide ningún campo, y el de opciones muestra los dos interruptores con este esquema:

[
  {"name": "all_llm_apis", "required": true, "default": true},
  {"name": "require_admin", "required": true, "default": true}
]

El servidor necesita un token en cada petición. Sin cabecera Authorization, /api/mcp responde 401, y una ruta de API inexistente como /api/mcp/nope responde 404.

Cómo conectar tu agente con un token de larga duración

El método más directo para un agente en tu red es un token de larga duración. Créalo en Perfil > Seguridad > Tokens de acceso de larga duración y cópialo, porque Home Assistant no lo vuelve a mostrar.

Con Claude Code, el servidor se añade con un comando. Usa --transport http, porque Home Assistant habla Streamable HTTP:

claude mcp add --transport http home-assistant \
  http://homeassistant.local:8123/api/mcp \
  --header "Authorization: Bearer tu_token_de_acceso"

Con --scope project el servidor queda en el .mcp.json del proyecto y Claude Code pide aprobarlo la primera vez que arranca; claude mcp list lo muestra en estado pendiente hasta entonces. Si el cliente solo admite stdio, la documentación de la integración propone mcp-proxy como pasarela.

Para un agente propio en Python, el SDK oficial de MCP se conecta así. Con la versión 2.3.0 del SDK, la autenticación va en un httpx2.AsyncClient:

import asyncio, httpx2
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client

URL = "http://homeassistant.local:8123/api/mcp"
TOKEN = "tu_token_de_acceso"

async def main():
    auth = {"Authorization": f"Bearer {TOKEN}"}
    async with httpx2.AsyncClient(headers=auth) as hc, \
            streamable_http_client(URL, http_client=hc) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            tools = (await s.list_tools()).tools
            print([t.name for t in tools])
            res = await s.call_tool("intent__HassTurnOn",
                                    {"name": "Kitchen Lights"})
            print(res.content[0].text)

asyncio.run(main())

El script lista las herramientas y enciende la luz de la cocina. Si vienes del SDK 1.x, dos cambios me hicieron fallar el primer intento. La función se llama streamable_http_client y devuelve dos flujos en lugar de tres, y los campos del resultado van en snake_case (server_info, protocol_version). Están explicados en la guía para migrar un servidor MCP a FastMCP 4 y al SDK 2.

Qué ve el agente de tu casa

Lo que el agente puede tocar depende de dos filtros: las API de LLM habilitadas y las entidades expuestas a los asistentes. Con la configuración por defecto, el servidor ofreció 28 herramientas, todas con el nombre de su dominio delante:

  • Control: intent__HassTurnOn, intent__HassTurnOff, intent__HassSetPosition, light__HassLightSet, climate__HassClimateSetTemperature
  • Multimedia: pausa, reanudar, siguiente, volumen y silencio de media_player
  • Listas: todo__get_items, todo__HassListAddItem y dos más
  • Contexto: homeassistant__GetLiveContext y llm__GetDateTime

El servidor también publica un prompt llamado Assist con las instrucciones del asistente. Ojo con los nombres: llamar a HassTurnOn sin el prefijo devuelve Tool "HassTurnOn" not found. Un agente que lee la lista de herramientas lo resuelve solo, pero un script escrito a mano contra la documentación antigua falla.

GetLiveContext devolvió 5030 caracteres que describían 45 entidades de 12 dominios: luces, persianas, climatización, ventiladores, humidificadores, reproductores, interruptores, aspiradores, calentadores de agua, listas de tareas y algunos sensores. Las cerraduras no aparecían, y al pedir intent__HassTurnOn sobre la puerta de entrada el servidor contestó "No matching entities are exposed to the assistant".

La razón está en el código de Home Assistant. La lista DEFAULT_EXPOSED_DOMAINS de exposed_entities.py incluye light, cover, climate y otros ocho dominios, pero no lock, alarm_control_panel ni camera. Exponer "todo" se refiere a las API de LLM, no a las entidades: una cerradura solo llega al agente si la expones a mano en Ajustes > Asistentes de voz > Exponer.

Qué probé Resultado
Versión negociada del protocolo 2025-11-25 (SDK de Python 1.28.1 en el servidor)
Herramientas ofrecidas 28
Entidades en el contexto en vivo 45 de 122
intent__HassTurnOn sobre una luz Correcto, 12 ms
intent__HassTurnOn sobre una cerradura Error: entidad no expuesta
Petición sin token HTTP 401

Qué conviene limitar antes de conectar un modelo

Un modelo con acceso a tu casa puede equivocarse de entidad o ejecutar una instrucción que llegó escondida en un texto. Tres ajustes reducen el riesgo:

  1. Crea un usuario solo para el agente. Desactiva Exigir una cuenta de administrador y conecta el agente con el token de ese usuario. Según la documentación, la ruta /api/mcp/assist queda disponible para cuentas sin privilegios, y el resto de API siguen exigiendo administrador.
  2. Revisa la lista de entidades expuestas. Quita lo que el agente no necesita. No expongas cerraduras ni alarmas salvo que tengas un motivo claro.
  3. Desactiva "Exponer todas las API de LLM" si instalas integraciones que traen sus propias herramientas, como la de KNX que estrena la 2026.10 y puede escribir valores en el bus.

Si el agente corre fuera de tu red, la documentación recomienda OAuth en lugar de un token fijo. Home Assistant no usa registro dinámico de clientes (RFC 7591): el identificador de cliente es la URL base de la aplicación, por ejemplo https://claude.ai. Para entender por qué un servidor MCP expuesto necesita esa capa, repasa qué rompe la especificación 2026-07-28 de MCP.

Qué no he probado

Probé una instancia nueva con entidades de demostración, no una casa real. No he conectado ChatGPT ni Cursor ni he probado OAuth. Tampoco he medido cuántos tokens consume el contexto en vivo con cientos de dispositivos; la única cifra que tengo son los 5030 caracteres de 45 entidades. Tampoco comprobé con un usuario sin privilegios la ruta de Assist; esa parte sale de la documentación.

Preguntas frecuentes

¿Necesito Home Assistant Cloud para usar el servidor MCP?

No. El servidor funciona dentro de tu red con un token de larga duración, como en esta guía. Home Assistant Cloud solo simplifica el acceso remoto con OAuth, porque evita configurar un proxy inverso o un túnel. El servicio pasará a llamarse Home Assistant Link con la versión 2026.12, según anunció el proyecto el 2 de octubre.

¿Puede el agente abrir mi cerradura?

No con la configuración por defecto. Los dominios lock, alarm_control_panel y camera no se exponen a los asistentes salvo que lo hagas a mano en la página de entidades expuestas.

¿Funciona con modelos locales?

Sí, siempre que el cliente hable MCP por Streamable HTTP. Puedes usar un agente propio con el SDK de Python, como en el ejemplo, y un modelo servido en tu propia máquina que admita llamadas a funciones con Ollama.

Conclusión

La 2026.10 no cambia lo que el servidor MCP de Home Assistant sabe hacer, cambia lo que cuesta activarlo: un interruptor, una URL y un token. Las opciones por defecto son prudentes con las cuentas (solo administradores) y generosas con las API, mientras que las entidades sensibles siguen fuera hasta que las expones tú.

El siguiente paso es crear un usuario dedicado para el agente, revisar las entidades expuestas y conectar Claude Code o tu propio script con el token de ese usuario.

Fuentes: [1] Home Assistant 2026.10, notas de la versión[1], [2] Documentación de la integración Model Context Protocol Server[2], [3] Exponer entidades a los asistentes de voz[3], [4] Código de exposed_entities.py en home-assistant/core[4], [5] Lanzamientos de home-assistant/core[5], [6] SDK de Python de Model Context Protocol[6], [7] Transporte Streamable HTTP en la especificación de MCP[7], [8] Blog de Home Assistant, cambio de nombre de Home Assistant Cloud[8].

Fuentes

  1. Home Assistant 2026.10, notas de la versión
  2. Documentación de la integración Model Context Protocol Server
  3. Exponer entidades a los asistentes de voz
  4. Código de exposed_entities.py en home-assistant/core
  5. Lanzamientos de home-assistant/core
  6. SDK de Python de Model Context Protocol
  7. Transporte Streamable HTTP en la especificación de MCP
  8. Blog de Home Assistant, cambio de nombre de Home Assistant Cloud