@coffeerunhobby/mcp-ha-connect 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/.dockerignore +8 -0
  2. package/.env.example +149 -0
  3. package/.gitattributes +30 -0
  4. package/Dockerfile +33 -0
  5. package/LICENSE +21 -0
  6. package/README.md +394 -0
  7. package/dist/config.d.ts +33 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +183 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/haClient/automations.d.ts +67 -0
  12. package/dist/haClient/automations.d.ts.map +1 -0
  13. package/dist/haClient/automations.js +181 -0
  14. package/dist/haClient/automations.js.map +1 -0
  15. package/dist/haClient/config.d.ts +28 -0
  16. package/dist/haClient/config.d.ts.map +1 -0
  17. package/dist/haClient/config.js +38 -0
  18. package/dist/haClient/config.js.map +1 -0
  19. package/dist/haClient/devices.d.ts +219 -0
  20. package/dist/haClient/devices.d.ts.map +1 -0
  21. package/dist/haClient/devices.js +506 -0
  22. package/dist/haClient/devices.js.map +1 -0
  23. package/dist/haClient/entities.d.ts +35 -0
  24. package/dist/haClient/entities.d.ts.map +1 -0
  25. package/dist/haClient/entities.js +97 -0
  26. package/dist/haClient/entities.js.map +1 -0
  27. package/dist/haClient/events.d.ts +138 -0
  28. package/dist/haClient/events.d.ts.map +1 -0
  29. package/dist/haClient/events.js +344 -0
  30. package/dist/haClient/events.js.map +1 -0
  31. package/dist/haClient/history.d.ts +26 -0
  32. package/dist/haClient/history.d.ts.map +1 -0
  33. package/dist/haClient/history.js +54 -0
  34. package/dist/haClient/history.js.map +1 -0
  35. package/dist/haClient/index.d.ts +153 -0
  36. package/dist/haClient/index.d.ts.map +1 -0
  37. package/dist/haClient/index.js +223 -0
  38. package/dist/haClient/index.js.map +1 -0
  39. package/dist/haClient/request.d.ts +34 -0
  40. package/dist/haClient/request.d.ts.map +1 -0
  41. package/dist/haClient/request.js +93 -0
  42. package/dist/haClient/request.js.map +1 -0
  43. package/dist/haClient/services.d.ts +22 -0
  44. package/dist/haClient/services.d.ts.map +1 -0
  45. package/dist/haClient/services.js +39 -0
  46. package/dist/haClient/services.js.map +1 -0
  47. package/dist/haClient/states.d.ts +26 -0
  48. package/dist/haClient/states.d.ts.map +1 -0
  49. package/dist/haClient/states.js +53 -0
  50. package/dist/haClient/states.js.map +1 -0
  51. package/dist/haClient/updates.d.ts +22 -0
  52. package/dist/haClient/updates.d.ts.map +1 -0
  53. package/dist/haClient/updates.js +48 -0
  54. package/dist/haClient/updates.js.map +1 -0
  55. package/dist/haClient.d.ts +97 -0
  56. package/dist/haClient.d.ts.map +1 -0
  57. package/dist/haClient.js +344 -0
  58. package/dist/haClient.js.map +1 -0
  59. package/dist/index.d.ts +8 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +92 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/localAI/index.d.ts +37 -0
  64. package/dist/localAI/index.d.ts.map +1 -0
  65. package/dist/localAI/index.js +73 -0
  66. package/dist/localAI/index.js.map +1 -0
  67. package/dist/localAI/prompts.d.ts +20 -0
  68. package/dist/localAI/prompts.d.ts.map +1 -0
  69. package/dist/localAI/prompts.js +48 -0
  70. package/dist/localAI/prompts.js.map +1 -0
  71. package/dist/localAI/providers/base.d.ts +51 -0
  72. package/dist/localAI/providers/base.d.ts.map +1 -0
  73. package/dist/localAI/providers/base.js +80 -0
  74. package/dist/localAI/providers/base.js.map +1 -0
  75. package/dist/localAI/providers/ollama.d.ts +22 -0
  76. package/dist/localAI/providers/ollama.d.ts.map +1 -0
  77. package/dist/localAI/providers/ollama.js +63 -0
  78. package/dist/localAI/providers/ollama.js.map +1 -0
  79. package/dist/localAI/providers/openai.d.ts +23 -0
  80. package/dist/localAI/providers/openai.d.ts.map +1 -0
  81. package/dist/localAI/providers/openai.js +63 -0
  82. package/dist/localAI/providers/openai.js.map +1 -0
  83. package/dist/localAI/types.d.ts +61 -0
  84. package/dist/localAI/types.d.ts.map +1 -0
  85. package/dist/localAI/types.js +6 -0
  86. package/dist/localAI/types.js.map +1 -0
  87. package/dist/ollamaClient.d.ts +37 -0
  88. package/dist/ollamaClient.d.ts.map +1 -0
  89. package/dist/ollamaClient.js +110 -0
  90. package/dist/ollamaClient.js.map +1 -0
  91. package/dist/resources/index.d.ts +11 -0
  92. package/dist/resources/index.d.ts.map +1 -0
  93. package/dist/resources/index.js +238 -0
  94. package/dist/resources/index.js.map +1 -0
  95. package/dist/server/common.d.ts +9 -0
  96. package/dist/server/common.d.ts.map +1 -0
  97. package/dist/server/common.js +27 -0
  98. package/dist/server/common.js.map +1 -0
  99. package/dist/server/eventSubscription.d.ts +53 -0
  100. package/dist/server/eventSubscription.d.ts.map +1 -0
  101. package/dist/server/eventSubscription.js +257 -0
  102. package/dist/server/eventSubscription.js.map +1 -0
  103. package/dist/server/http.d.ts +12 -0
  104. package/dist/server/http.d.ts.map +1 -0
  105. package/dist/server/http.js +491 -0
  106. package/dist/server/http.js.map +1 -0
  107. package/dist/server/rateLimiter.d.ts +70 -0
  108. package/dist/server/rateLimiter.d.ts.map +1 -0
  109. package/dist/server/rateLimiter.js +156 -0
  110. package/dist/server/rateLimiter.js.map +1 -0
  111. package/dist/server/sse.d.ts +32 -0
  112. package/dist/server/sse.d.ts.map +1 -0
  113. package/dist/server/sse.js +76 -0
  114. package/dist/server/sse.js.map +1 -0
  115. package/dist/server/stdio.d.ts +8 -0
  116. package/dist/server/stdio.d.ts.map +1 -0
  117. package/dist/server/stdio.js +16 -0
  118. package/dist/server/stdio.js.map +1 -0
  119. package/dist/server/stream.d.ts +26 -0
  120. package/dist/server/stream.d.ts.map +1 -0
  121. package/dist/server/stream.js +81 -0
  122. package/dist/server/stream.js.map +1 -0
  123. package/dist/server.d.ts +8 -0
  124. package/dist/server.d.ts.map +1 -0
  125. package/dist/server.js +30 -0
  126. package/dist/server.js.map +1 -0
  127. package/dist/tools/callService.d.ts +8 -0
  128. package/dist/tools/callService.d.ts.map +1 -0
  129. package/dist/tools/callService.js +100 -0
  130. package/dist/tools/callService.js.map +1 -0
  131. package/dist/tools/getClient.d.ts +8 -0
  132. package/dist/tools/getClient.d.ts.map +1 -0
  133. package/dist/tools/getClient.js +94 -0
  134. package/dist/tools/getClient.js.map +1 -0
  135. package/dist/tools/getDevice.d.ts +8 -0
  136. package/dist/tools/getDevice.d.ts.map +1 -0
  137. package/dist/tools/getDevice.js +94 -0
  138. package/dist/tools/getDevice.js.map +1 -0
  139. package/dist/tools/getEntitiesByDomain.d.ts +8 -0
  140. package/dist/tools/getEntitiesByDomain.d.ts.map +1 -0
  141. package/dist/tools/getEntitiesByDomain.js +80 -0
  142. package/dist/tools/getEntitiesByDomain.js.map +1 -0
  143. package/dist/tools/getState.d.ts +8 -0
  144. package/dist/tools/getState.d.ts.map +1 -0
  145. package/dist/tools/getState.js +90 -0
  146. package/dist/tools/getState.js.map +1 -0
  147. package/dist/tools/getStates.d.ts +8 -0
  148. package/dist/tools/getStates.d.ts.map +1 -0
  149. package/dist/tools/getStates.js +70 -0
  150. package/dist/tools/getStates.js.map +1 -0
  151. package/dist/tools/index.d.ts +9 -0
  152. package/dist/tools/index.d.ts.map +1 -0
  153. package/dist/tools/index.js +9 -0
  154. package/dist/tools/index.js.map +1 -0
  155. package/dist/tools/listClients.d.ts +8 -0
  156. package/dist/tools/listClients.d.ts.map +1 -0
  157. package/dist/tools/listClients.js +73 -0
  158. package/dist/tools/listClients.js.map +1 -0
  159. package/dist/tools/listDevices.d.ts +8 -0
  160. package/dist/tools/listDevices.d.ts.map +1 -0
  161. package/dist/tools/listDevices.js +73 -0
  162. package/dist/tools/listDevices.js.map +1 -0
  163. package/dist/tools/listSites.d.ts +8 -0
  164. package/dist/tools/listSites.d.ts.map +1 -0
  165. package/dist/tools/listSites.js +67 -0
  166. package/dist/tools/listSites.js.map +1 -0
  167. package/dist/tools/registry.d.ts +9 -0
  168. package/dist/tools/registry.d.ts.map +1 -0
  169. package/dist/tools/registry.js +1382 -0
  170. package/dist/tools/registry.js.map +1 -0
  171. package/dist/tools/searchDevices.d.ts +8 -0
  172. package/dist/tools/searchDevices.d.ts.map +1 -0
  173. package/dist/tools/searchDevices.js +84 -0
  174. package/dist/tools/searchDevices.js.map +1 -0
  175. package/dist/tools/searchEntities.d.ts +8 -0
  176. package/dist/tools/searchEntities.d.ts.map +1 -0
  177. package/dist/tools/searchEntities.js +80 -0
  178. package/dist/tools/searchEntities.js.map +1 -0
  179. package/dist/types/entity.d.ts +98 -0
  180. package/dist/types/entity.d.ts.map +1 -0
  181. package/dist/types/entity.js +2 -0
  182. package/dist/types/entity.js.map +1 -0
  183. package/dist/types/errors.d.ts +16 -0
  184. package/dist/types/errors.d.ts.map +1 -0
  185. package/dist/types/errors.js +32 -0
  186. package/dist/types/errors.js.map +1 -0
  187. package/dist/types/haConfig.d.ts +8 -0
  188. package/dist/types/haConfig.d.ts.map +1 -0
  189. package/dist/types/haConfig.js +2 -0
  190. package/dist/types/haConfig.js.map +1 -0
  191. package/dist/types/index.d.ts +6 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +2 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/request.d.ts +7 -0
  196. package/dist/types/request.d.ts.map +1 -0
  197. package/dist/types/request.js +2 -0
  198. package/dist/types/request.js.map +1 -0
  199. package/dist/types/serviceCall.d.ts +18 -0
  200. package/dist/types/serviceCall.d.ts.map +1 -0
  201. package/dist/types/serviceCall.js +2 -0
  202. package/dist/types/serviceCall.js.map +1 -0
  203. package/dist/types.d.ts +2 -0
  204. package/dist/types.d.ts.map +1 -0
  205. package/dist/types.js +3 -0
  206. package/dist/types.js.map +1 -0
  207. package/dist/utils/config-validations.d.ts +12 -0
  208. package/dist/utils/config-validations.d.ts.map +1 -0
  209. package/dist/utils/config-validations.js +43 -0
  210. package/dist/utils/config-validations.js.map +1 -0
  211. package/dist/utils/logger.d.ts +24 -0
  212. package/dist/utils/logger.d.ts.map +1 -0
  213. package/dist/utils/logger.js +94 -0
  214. package/dist/utils/logger.js.map +1 -0
  215. package/dist/wrapper.d.ts +8 -0
  216. package/dist/wrapper.d.ts.map +1 -0
  217. package/dist/wrapper.js +301 -0
  218. package/dist/wrapper.js.map +1 -0
  219. package/docker-compose.yml +17 -0
  220. package/docs/CHANGELOG.md +86 -0
  221. package/docs/LOCAL_CLIENT.md +268 -0
  222. package/docs/SSE_API.md +341 -0
  223. package/eslint.config.js +33 -0
  224. package/n8n/ai-agent-safety-monitor.json +355 -0
  225. package/openapi.json +166 -0
  226. package/package.json +51 -0
  227. package/src/config.ts +260 -0
  228. package/src/haClient/automations.ts +217 -0
  229. package/src/haClient/config.ts +41 -0
  230. package/src/haClient/devices.ts +653 -0
  231. package/src/haClient/entities.ts +128 -0
  232. package/src/haClient/events.ts +456 -0
  233. package/src/haClient/history.ts +68 -0
  234. package/src/haClient/index.ts +287 -0
  235. package/src/haClient/request.ts +127 -0
  236. package/src/haClient/services.ts +45 -0
  237. package/src/haClient/states.ts +60 -0
  238. package/src/haClient/updates.ts +58 -0
  239. package/src/index.ts +99 -0
  240. package/src/localAI/index.ts +88 -0
  241. package/src/localAI/prompts.ts +50 -0
  242. package/src/localAI/providers/base.ts +120 -0
  243. package/src/localAI/providers/ollama.ts +78 -0
  244. package/src/localAI/providers/openai.ts +86 -0
  245. package/src/localAI/types.ts +67 -0
  246. package/src/resources/index.ts +266 -0
  247. package/src/server/common.ts +38 -0
  248. package/src/server/eventSubscription.ts +318 -0
  249. package/src/server/http.ts +546 -0
  250. package/src/server/rateLimiter.ts +195 -0
  251. package/src/server/sse.ts +120 -0
  252. package/src/server/stdio.ts +22 -0
  253. package/src/server/stream.ts +113 -0
  254. package/src/tools/callService.ts +114 -0
  255. package/src/tools/getEntitiesByDomain.ts +92 -0
  256. package/src/tools/getState.ts +103 -0
  257. package/src/tools/getStates.ts +80 -0
  258. package/src/tools/index.ts +9 -0
  259. package/src/tools/registry.ts +1521 -0
  260. package/src/tools/searchEntities.ts +92 -0
  261. package/src/types/entity.ts +110 -0
  262. package/src/types/errors.ts +33 -0
  263. package/src/types/haConfig.ts +7 -0
  264. package/src/types/index.ts +5 -0
  265. package/src/types/request.ts +6 -0
  266. package/src/types/serviceCall.ts +18 -0
  267. package/src/types.ts +2 -0
  268. package/src/utils/config-validations.ts +46 -0
  269. package/src/utils/logger.ts +114 -0
  270. package/src/wrapper.ts +340 -0
  271. package/tests/config.test.ts +332 -0
  272. package/tests/haClient/automations.test.ts +133 -0
  273. package/tests/haClient/config.test.ts +96 -0
  274. package/tests/haClient/entities.test.ts +188 -0
  275. package/tests/haClient/history.test.ts +170 -0
  276. package/tests/haClient/index.test.ts +221 -0
  277. package/tests/haClient/request.test.ts +217 -0
  278. package/tests/haClient/services.test.ts +120 -0
  279. package/tests/haClient/states.test.ts +119 -0
  280. package/tests/haClient/updates.test.ts +193 -0
  281. package/tests/index.test.ts +164 -0
  282. package/tests/localAI/index.test.ts +168 -0
  283. package/tests/localAI/ollama.test.ts +187 -0
  284. package/tests/localAI/openai.test.ts +257 -0
  285. package/tests/server/common.test.ts +64 -0
  286. package/tests/server/http.test.ts +326 -0
  287. package/tests/server/sse.test.ts +240 -0
  288. package/tests/server/stdio.test.ts +102 -0
  289. package/tests/server/stream.test.ts +287 -0
  290. package/tests/tools/registry.test.ts +355 -0
  291. package/tests/utils/config-validations.test.ts +289 -0
  292. package/tests/utils/logger.test.ts +327 -0
  293. package/tsconfig.json +25 -0
  294. package/vitest.config.ts +26 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * State Operations for Home Assistant API
3
+ * Handles entity state retrieval
4
+ */
5
+ import { ApiError } from '../types/index.js';
6
+ import { logger } from '../utils/logger.js';
7
+ /**
8
+ * State-related operations for the Home Assistant API.
9
+ */
10
+ export class StateOperations {
11
+ request;
12
+ constructor(request) {
13
+ this.request = request;
14
+ }
15
+ /**
16
+ * Get all states (entities)
17
+ */
18
+ async getStates() {
19
+ logger.debug('Fetching all states');
20
+ const states = await this.request.get('/states');
21
+ logger.info('Fetched states', { count: states.length });
22
+ return states;
23
+ }
24
+ /**
25
+ * Get state of a specific entity
26
+ */
27
+ async getState(entityId) {
28
+ logger.debug('Fetching state', { entityId });
29
+ try {
30
+ const state = await this.request.get(`/states/${entityId}`);
31
+ return state;
32
+ }
33
+ catch (error) {
34
+ if (error instanceof ApiError && error.statusCode === 404) {
35
+ logger.warn('Entity not found', { entityId });
36
+ return null;
37
+ }
38
+ throw error;
39
+ }
40
+ }
41
+ /**
42
+ * Get all sensors (sensor.* and binary_sensor.* entities)
43
+ */
44
+ async getAllSensors() {
45
+ logger.debug('Fetching all sensors');
46
+ const allStates = await this.getStates();
47
+ const sensors = allStates.filter(entity => entity.entity_id.startsWith('sensor.') ||
48
+ entity.entity_id.startsWith('binary_sensor.'));
49
+ logger.info('Fetched sensors', { count: sensors.length });
50
+ return sensors;
51
+ }
52
+ }
53
+ //# sourceMappingURL=states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/haClient/states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAW,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAS,WAAW,QAAQ,EAAE,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACxC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAC9C,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Update Operations for Home Assistant API
3
+ * Handles checking for available updates
4
+ */
5
+ import type { Entity, UpdateInfo } from '../types/index.js';
6
+ import type { EntityOperations } from './entities.js';
7
+ /**
8
+ * Update-related operations for the Home Assistant API.
9
+ */
10
+ export declare class UpdateOperations {
11
+ private readonly entityOps;
12
+ constructor(entityOps: EntityOperations);
13
+ /**
14
+ * Get available updates by checking update.* entities
15
+ * Works with regular long-lived access tokens
16
+ */
17
+ getAvailableUpdates(): Promise<{
18
+ updates: UpdateInfo[];
19
+ entities: Entity[];
20
+ }>;
21
+ }
22
+ //# sourceMappingURL=updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/haClient/updates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;GAEG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,gBAAgB;IAExD;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CAmCH"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Update Operations for Home Assistant API
3
+ * Handles checking for available updates
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ /**
7
+ * Update-related operations for the Home Assistant API.
8
+ */
9
+ export class UpdateOperations {
10
+ entityOps;
11
+ constructor(entityOps) {
12
+ this.entityOps = entityOps;
13
+ }
14
+ /**
15
+ * Get available updates by checking update.* entities
16
+ * Works with regular long-lived access tokens
17
+ */
18
+ async getAvailableUpdates() {
19
+ logger.debug('Fetching available updates from update entities');
20
+ // Get all update entities
21
+ const updateEntities = await this.entityOps.getEntitiesByDomain('update');
22
+ // Filter to only those with updates available (state = 'on')
23
+ const updates = [];
24
+ for (const entity of updateEntities) {
25
+ const attrs = entity.attributes;
26
+ const installedVersion = attrs.installed_version;
27
+ const latestVersion = attrs.latest_version;
28
+ const title = attrs.title || attrs.friendly_name || entity.entity_id;
29
+ // state 'on' means update is available
30
+ if (entity.state === 'on' && installedVersion && latestVersion) {
31
+ updates.push({
32
+ update_type: entity.entity_id.includes('core') ? 'core' :
33
+ entity.entity_id.includes('supervisor') ? 'supervisor' :
34
+ entity.entity_id.includes('operating_system') ? 'os' : 'addon',
35
+ name: title,
36
+ version_current: installedVersion,
37
+ version_latest: latestVersion,
38
+ });
39
+ }
40
+ }
41
+ logger.info('Fetched available updates', { updateCount: updates.length, totalEntities: updateEntities.length });
42
+ return {
43
+ updates,
44
+ entities: updateEntities,
45
+ };
46
+ }
47
+ }
48
+ //# sourceMappingURL=updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/haClient/updates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAAG,CAAC;IAE5D;;;OAGG;IACH,KAAK,CAAC,mBAAmB;QAIvB,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAEhE,0BAA0B;QAC1B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAE1E,6DAA6D;QAC7D,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;YAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC,iBAAuC,CAAC;YACvE,MAAM,aAAa,GAAG,KAAK,CAAC,cAAoC,CAAC;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,IAAI,KAAK,CAAC,aAAuB,IAAI,MAAM,CAAC,SAAS,CAAC;YAEzF,uCAAuC;YACvC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC;oBACX,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBAC5C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;4BACxD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;oBAC3E,IAAI,EAAE,KAAK;oBACX,eAAe,EAAE,gBAAgB;oBACjC,cAAc,EAAE,aAAa;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhH,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,cAAc;SACzB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Home Assistant API Client
3
+ * Handles authentication and API requests
4
+ */
5
+ import type { EnvironmentConfig } from './config.js';
6
+ import { type Entity, type ServiceCallData, type ServiceCallResponse, type Automation, type DomainSummary, type HaVersion, type LogbookEntry, type UpdateInfo } from './types/index.js';
7
+ export declare class HaClient {
8
+ private httpsAgent?;
9
+ private baseUrl;
10
+ private token;
11
+ private timeout;
12
+ constructor(config: EnvironmentConfig);
13
+ /**
14
+ * Make authenticated request to Home Assistant API
15
+ */
16
+ private request;
17
+ /**
18
+ * Get all states (entities)
19
+ */
20
+ getStates(): Promise<Entity[]>;
21
+ /**
22
+ * Get state of a specific entity
23
+ */
24
+ getState(entityId: string): Promise<Entity | null>;
25
+ /**
26
+ * Call a service
27
+ */
28
+ callService(data: ServiceCallData): Promise<ServiceCallResponse>;
29
+ /**
30
+ * Get entities filtered by domain
31
+ */
32
+ getEntitiesByDomain(domain: string): Promise<Entity[]>;
33
+ /**
34
+ * Search entities by name or entity_id
35
+ */
36
+ searchEntities(query: string): Promise<Entity[]>;
37
+ /**
38
+ * Get config
39
+ */
40
+ getConfig(): Promise<Record<string, unknown>>;
41
+ /**
42
+ * Check API (health check)
43
+ */
44
+ checkApi(): Promise<{
45
+ message: string;
46
+ }>;
47
+ /**
48
+ * Get all sensors (sensor.* and binary_sensor.* entities)
49
+ */
50
+ getAllSensors(): Promise<Entity[]>;
51
+ /**
52
+ * Get historical data for an entity
53
+ */
54
+ getHistory(entityId: string, hours?: number): Promise<Entity[][]>;
55
+ /**
56
+ * Get Home Assistant version and configuration info
57
+ */
58
+ getVersion(): Promise<HaVersion>;
59
+ /**
60
+ * Get all automations
61
+ */
62
+ getAutomations(): Promise<Automation[]>;
63
+ /**
64
+ * Restart Home Assistant
65
+ */
66
+ restartServer(): Promise<void>;
67
+ /**
68
+ * Get system log entries from the logbook
69
+ * Returns recent events/state changes, optionally filtered by entity
70
+ */
71
+ getSystemLog(options?: {
72
+ hours?: number;
73
+ entity_id?: string;
74
+ }): Promise<LogbookEntry[]>;
75
+ /**
76
+ * Get domain summary with entity counts and state breakdown
77
+ */
78
+ getDomainSummary(domain: string): Promise<DomainSummary>;
79
+ /**
80
+ * List entities with optional filtering
81
+ */
82
+ listEntities(options?: {
83
+ domain?: string;
84
+ search?: string;
85
+ limit?: number;
86
+ state?: string;
87
+ }): Promise<Entity[]>;
88
+ /**
89
+ * Get available updates by checking update.* entities
90
+ * Works with regular long-lived access tokens
91
+ */
92
+ getAvailableUpdates(): Promise<{
93
+ updates: UpdateInfo[];
94
+ entities: Entity[];
95
+ }>;
96
+ }
97
+ //# sourceMappingURL=haClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"haClient.d.ts","sourceRoot":"","sources":["../src/haClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EAGhB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,iBAAiB;IAcrC;;OAEG;YACW,OAAO;IAwErB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOpC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAexD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmBtE;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgB5D;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBtD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKnD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAK9C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAaxC;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAuB3E;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAOtC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB7C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC;;;OAGG;IACG,YAAY,CAAC,OAAO,GAAE;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsBhC;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA6B9D;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiC1B;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CAmCH"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Home Assistant API Client
3
+ * Handles authentication and API requests
4
+ */
5
+ import https from 'https';
6
+ import { AuthenticationError, ApiError, } from './types/index.js';
7
+ import { logger } from './utils/logger.js';
8
+ export class HaClient {
9
+ httpsAgent;
10
+ baseUrl;
11
+ token;
12
+ timeout;
13
+ constructor(config) {
14
+ this.baseUrl = config.baseUrl;
15
+ this.token = config.token;
16
+ this.timeout = config.timeout;
17
+ // Create HTTPS agent with custom SSL settings
18
+ if (!config.strictSsl) {
19
+ this.httpsAgent = new https.Agent({
20
+ rejectUnauthorized: false,
21
+ });
22
+ logger.warn('SSL certificate validation is disabled');
23
+ }
24
+ }
25
+ /**
26
+ * Make authenticated request to Home Assistant API
27
+ */
28
+ async request(path, options = {}) {
29
+ const url = new URL(`${this.baseUrl}/api${path}`);
30
+ // Add query parameters
31
+ if (options.params) {
32
+ Object.entries(options.params).forEach(([key, value]) => {
33
+ url.searchParams.append(key, String(value));
34
+ });
35
+ }
36
+ const headers = {
37
+ 'Authorization': `Bearer ${this.token}`,
38
+ 'Content-Type': 'application/json',
39
+ ...options.headers,
40
+ };
41
+ logger.debug('Making API request', {
42
+ method: options.method ?? 'GET',
43
+ path,
44
+ params: options.params,
45
+ });
46
+ try {
47
+ const response = await fetch(url.toString(), {
48
+ method: options.method ?? 'GET',
49
+ headers,
50
+ body: options.body ? JSON.stringify(options.body) : undefined,
51
+ // @ts-expect-error - agent is valid but not in types
52
+ agent: this.httpsAgent,
53
+ signal: AbortSignal.timeout(this.timeout),
54
+ });
55
+ if (!response.ok) {
56
+ const errorText = await response.text();
57
+ if (response.status === 401) {
58
+ throw new AuthenticationError('Invalid Home Assistant token', { status: response.status, body: errorText });
59
+ }
60
+ throw new ApiError(`API request failed: ${response.statusText}`, response.status, { path, body: errorText });
61
+ }
62
+ // Handle empty responses
63
+ const contentType = response.headers.get('content-type');
64
+ if (!contentType?.includes('application/json')) {
65
+ return {};
66
+ }
67
+ const data = await response.json();
68
+ return data;
69
+ }
70
+ catch (error) {
71
+ if (error instanceof AuthenticationError || error instanceof ApiError) {
72
+ throw error;
73
+ }
74
+ throw new ApiError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, 500, { path });
75
+ }
76
+ }
77
+ // ===== API Methods =====
78
+ /**
79
+ * Get all states (entities)
80
+ */
81
+ async getStates() {
82
+ logger.debug('Fetching all states');
83
+ const states = await this.request('/states');
84
+ logger.info('Fetched states', { count: states.length });
85
+ return states;
86
+ }
87
+ /**
88
+ * Get state of a specific entity
89
+ */
90
+ async getState(entityId) {
91
+ logger.debug('Fetching state', { entityId });
92
+ try {
93
+ const state = await this.request(`/states/${entityId}`);
94
+ return state;
95
+ }
96
+ catch (error) {
97
+ if (error instanceof ApiError && error.statusCode === 404) {
98
+ logger.warn('Entity not found', { entityId });
99
+ return null;
100
+ }
101
+ throw error;
102
+ }
103
+ }
104
+ /**
105
+ * Call a service
106
+ */
107
+ async callService(data) {
108
+ logger.info('Calling service', {
109
+ domain: data.domain,
110
+ service: data.service,
111
+ hasTarget: !!data.target,
112
+ });
113
+ const path = `/services/${data.domain}/${data.service}`;
114
+ const body = {
115
+ ...data.service_data,
116
+ ...data.target,
117
+ };
118
+ return await this.request(path, {
119
+ method: 'POST',
120
+ body,
121
+ });
122
+ }
123
+ /**
124
+ * Get entities filtered by domain
125
+ */
126
+ async getEntitiesByDomain(domain) {
127
+ logger.debug('Fetching entities by domain', { domain });
128
+ const allStates = await this.getStates();
129
+ const filtered = allStates.filter(entity => entity.entity_id.startsWith(`${domain}.`));
130
+ logger.info('Filtered entities by domain', {
131
+ domain,
132
+ count: filtered.length
133
+ });
134
+ return filtered;
135
+ }
136
+ /**
137
+ * Search entities by name or entity_id
138
+ */
139
+ async searchEntities(query) {
140
+ logger.debug('Searching entities', { query });
141
+ const allStates = await this.getStates();
142
+ const lowerQuery = query.toLowerCase();
143
+ const results = allStates.filter(entity => {
144
+ const entityIdMatch = entity.entity_id.toLowerCase().includes(lowerQuery);
145
+ const nameMatch = entity.attributes.friendly_name &&
146
+ String(entity.attributes.friendly_name).toLowerCase().includes(lowerQuery);
147
+ return entityIdMatch || nameMatch;
148
+ });
149
+ logger.info('Search completed', { query, results: results.length });
150
+ return results;
151
+ }
152
+ /**
153
+ * Get config
154
+ */
155
+ async getConfig() {
156
+ logger.debug('Fetching config');
157
+ return await this.request('/config');
158
+ }
159
+ /**
160
+ * Check API (health check)
161
+ */
162
+ async checkApi() {
163
+ logger.debug('Checking API health');
164
+ return await this.request('/');
165
+ }
166
+ /**
167
+ * Get all sensors (sensor.* and binary_sensor.* entities)
168
+ */
169
+ async getAllSensors() {
170
+ logger.debug('Fetching all sensors');
171
+ const allStates = await this.getStates();
172
+ const sensors = allStates.filter(entity => entity.entity_id.startsWith('sensor.') ||
173
+ entity.entity_id.startsWith('binary_sensor.'));
174
+ logger.info('Fetched sensors', { count: sensors.length });
175
+ return sensors;
176
+ }
177
+ /**
178
+ * Get historical data for an entity
179
+ */
180
+ async getHistory(entityId, hours = 24) {
181
+ logger.debug('Fetching history', { entityId, hours });
182
+ const endTime = new Date();
183
+ const startTime = new Date(endTime.getTime() - hours * 60 * 60 * 1000);
184
+ const path = `/history/period/${startTime.toISOString()}`;
185
+ const history = await this.request(path, {
186
+ params: {
187
+ filter_entity_id: entityId,
188
+ end_time: endTime.toISOString(),
189
+ },
190
+ });
191
+ logger.info('Fetched history', {
192
+ entityId,
193
+ hours,
194
+ records: history[0]?.length ?? 0
195
+ });
196
+ return history;
197
+ }
198
+ /**
199
+ * Get Home Assistant version and configuration info
200
+ */
201
+ async getVersion() {
202
+ logger.debug('Fetching Home Assistant version');
203
+ const config = await this.request('/config');
204
+ logger.info('Fetched version', { version: config.version });
205
+ return config;
206
+ }
207
+ /**
208
+ * Get all automations
209
+ */
210
+ async getAutomations() {
211
+ logger.debug('Fetching automations');
212
+ const allStates = await this.getStates();
213
+ const automations = allStates
214
+ .filter(entity => entity.entity_id.startsWith('automation.'))
215
+ .map(entity => ({
216
+ id: entity.entity_id,
217
+ alias: String(entity.attributes.friendly_name || entity.entity_id.replace('automation.', '')),
218
+ state: entity.state,
219
+ last_triggered: entity.attributes.last_triggered,
220
+ description: entity.attributes.description,
221
+ mode: entity.attributes.mode,
222
+ }));
223
+ logger.info('Fetched automations', { count: automations.length });
224
+ return automations;
225
+ }
226
+ /**
227
+ * Restart Home Assistant
228
+ */
229
+ async restartServer() {
230
+ logger.warn('Restarting Home Assistant');
231
+ await this.request('/services/homeassistant/restart', {
232
+ method: 'POST',
233
+ body: {},
234
+ });
235
+ logger.info('Home Assistant restart initiated');
236
+ }
237
+ /**
238
+ * Get system log entries from the logbook
239
+ * Returns recent events/state changes, optionally filtered by entity
240
+ */
241
+ async getSystemLog(options = {}) {
242
+ const hours = options.hours || 24;
243
+ logger.debug('Fetching system log', { hours, entity_id: options.entity_id });
244
+ const endTime = new Date();
245
+ const startTime = new Date(endTime.getTime() - hours * 60 * 60 * 1000);
246
+ let path = `/logbook/${startTime.toISOString()}`;
247
+ const params = {
248
+ end_time: endTime.toISOString(),
249
+ };
250
+ if (options.entity_id) {
251
+ params.entity = options.entity_id;
252
+ }
253
+ const entries = await this.request(path, { params });
254
+ logger.info('Fetched system log', { count: entries.length, hours });
255
+ return entries;
256
+ }
257
+ /**
258
+ * Get domain summary with entity counts and state breakdown
259
+ */
260
+ async getDomainSummary(domain) {
261
+ logger.debug('Fetching domain summary', { domain });
262
+ const entities = await this.getEntitiesByDomain(domain);
263
+ // Count states
264
+ const states = {};
265
+ const entityList = [];
266
+ for (const entity of entities) {
267
+ states[entity.state] = (states[entity.state] || 0) + 1;
268
+ entityList.push({
269
+ entity_id: entity.entity_id,
270
+ state: entity.state,
271
+ friendly_name: entity.attributes.friendly_name,
272
+ });
273
+ }
274
+ const summary = {
275
+ domain,
276
+ count: entities.length,
277
+ states,
278
+ entities: entityList,
279
+ };
280
+ logger.info('Fetched domain summary', { domain, count: summary.count });
281
+ return summary;
282
+ }
283
+ /**
284
+ * List entities with optional filtering
285
+ */
286
+ async listEntities(options = {}) {
287
+ logger.debug('Listing entities', options);
288
+ let entities = await this.getStates();
289
+ // Filter by domain
290
+ if (options.domain) {
291
+ entities = entities.filter(e => e.entity_id.startsWith(`${options.domain}.`));
292
+ }
293
+ // Filter by state
294
+ if (options.state) {
295
+ entities = entities.filter(e => e.state === options.state);
296
+ }
297
+ // Filter by search query
298
+ if (options.search) {
299
+ const query = options.search.toLowerCase();
300
+ entities = entities.filter(e => e.entity_id.toLowerCase().includes(query) ||
301
+ String(e.attributes.friendly_name || '').toLowerCase().includes(query));
302
+ }
303
+ // Apply limit
304
+ if (options.limit && options.limit > 0) {
305
+ entities = entities.slice(0, options.limit);
306
+ }
307
+ logger.info('Listed entities', { count: entities.length, ...options });
308
+ return entities;
309
+ }
310
+ /**
311
+ * Get available updates by checking update.* entities
312
+ * Works with regular long-lived access tokens
313
+ */
314
+ async getAvailableUpdates() {
315
+ logger.debug('Fetching available updates from update entities');
316
+ // Get all update entities
317
+ const updateEntities = await this.getEntitiesByDomain('update');
318
+ // Filter to only those with updates available (state = 'on')
319
+ const updates = [];
320
+ for (const entity of updateEntities) {
321
+ const attrs = entity.attributes;
322
+ const installedVersion = attrs.installed_version;
323
+ const latestVersion = attrs.latest_version;
324
+ const title = attrs.title || attrs.friendly_name || entity.entity_id;
325
+ // state 'on' means update is available
326
+ if (entity.state === 'on' && installedVersion && latestVersion) {
327
+ updates.push({
328
+ update_type: entity.entity_id.includes('core') ? 'core' :
329
+ entity.entity_id.includes('supervisor') ? 'supervisor' :
330
+ entity.entity_id.includes('operating_system') ? 'os' : 'addon',
331
+ name: title,
332
+ version_current: installedVersion,
333
+ version_latest: latestVersion,
334
+ });
335
+ }
336
+ }
337
+ logger.info('Fetched available updates', { updateCount: updates.length, totalEntities: updateEntities.length });
338
+ return {
339
+ updates,
340
+ entities: updateEntities,
341
+ };
342
+ }
343
+ }
344
+ //# sourceMappingURL=haClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"haClient.js","sourceRoot":"","sources":["../src/haClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Home Assistant MCP Server
4
+ * Entry point for the Model Context Protocol server
5
+ * Supports multiple transport modes: stdio, HTTP+SSE, HTTP+Stream
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}