@coffeerunhobby/mcp-ha-connect 0.5.0 → 0.7.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 (335) hide show
  1. package/README.md +438 -154
  2. package/dist/config.d.ts +0 -1
  3. package/dist/haClient/automations.d.ts +1 -2
  4. package/dist/haClient/automations.js +17 -7
  5. package/dist/haClient/automations.js.map +1 -1
  6. package/dist/haClient/calendars.d.ts +33 -0
  7. package/dist/haClient/calendars.js +68 -0
  8. package/dist/haClient/calendars.js.map +1 -0
  9. package/dist/haClient/config.d.ts +0 -1
  10. package/dist/haClient/devices.d.ts +0 -1
  11. package/dist/haClient/entities.d.ts +0 -1
  12. package/dist/haClient/events.d.ts +0 -1
  13. package/dist/haClient/history.d.ts +0 -1
  14. package/dist/haClient/index.d.ts +18 -2
  15. package/dist/haClient/index.js +23 -0
  16. package/dist/haClient/index.js.map +1 -1
  17. package/dist/haClient/labels.d.ts +64 -0
  18. package/dist/haClient/labels.js +177 -0
  19. package/dist/haClient/labels.js.map +1 -0
  20. package/dist/haClient/request.d.ts +0 -1
  21. package/dist/haClient/services.d.ts +0 -1
  22. package/dist/haClient/states.d.ts +0 -1
  23. package/dist/haClient/updates.d.ts +0 -1
  24. package/dist/index.d.ts +0 -1
  25. package/dist/localAI/index.d.ts +0 -1
  26. package/dist/localAI/prompts.d.ts +0 -1
  27. package/dist/localAI/providers/base.d.ts +0 -1
  28. package/dist/localAI/providers/ollama.d.ts +0 -1
  29. package/dist/localAI/providers/openai.d.ts +0 -1
  30. package/dist/localAI/types.d.ts +0 -1
  31. package/dist/resources/index.d.ts +2 -3
  32. package/dist/resources/index.js +132 -200
  33. package/dist/resources/index.js.map +1 -1
  34. package/dist/server/common.d.ts +2 -3
  35. package/dist/server/common.js +5 -10
  36. package/dist/server/common.js.map +1 -1
  37. package/dist/server/eventSubscription.d.ts +0 -1
  38. package/dist/server/http.d.ts +0 -1
  39. package/dist/server/rateLimiter.d.ts +0 -1
  40. package/dist/server/sse.d.ts +0 -1
  41. package/dist/server/stdio.d.ts +0 -1
  42. package/dist/server/stream.d.ts +0 -1
  43. package/dist/tools/analyzeSensors.d.ts +6 -0
  44. package/dist/tools/analyzeSensors.js +23 -0
  45. package/dist/tools/analyzeSensors.js.map +1 -0
  46. package/dist/tools/automationControls.d.ts +9 -0
  47. package/dist/tools/automationControls.js +41 -0
  48. package/dist/tools/automationControls.js.map +1 -0
  49. package/dist/tools/calendar.d.ts +7 -0
  50. package/dist/tools/calendar.js +82 -0
  51. package/dist/tools/calendar.js.map +1 -0
  52. package/dist/tools/callService.d.ts +3 -5
  53. package/dist/tools/callService.js +11 -94
  54. package/dist/tools/callService.js.map +1 -1
  55. package/dist/tools/common.d.ts +406 -0
  56. package/dist/tools/common.js +222 -0
  57. package/dist/tools/common.js.map +1 -0
  58. package/dist/tools/controlClimate.d.ts +6 -0
  59. package/dist/tools/controlClimate.js +50 -0
  60. package/dist/tools/controlClimate.js.map +1 -0
  61. package/dist/tools/controlCover.d.ts +6 -0
  62. package/dist/tools/controlCover.js +33 -0
  63. package/dist/tools/controlCover.js.map +1 -0
  64. package/dist/tools/controlFan.d.ts +6 -0
  65. package/dist/tools/controlFan.js +34 -0
  66. package/dist/tools/controlFan.js.map +1 -0
  67. package/dist/tools/controlLight.d.ts +6 -0
  68. package/dist/tools/controlLight.js +28 -0
  69. package/dist/tools/controlLight.js.map +1 -0
  70. package/dist/tools/controlMediaPlayer.d.ts +6 -0
  71. package/dist/tools/controlMediaPlayer.js +35 -0
  72. package/dist/tools/controlMediaPlayer.js.map +1 -0
  73. package/dist/tools/createAutomation.d.ts +6 -0
  74. package/dist/tools/createAutomation.js +24 -0
  75. package/dist/tools/createAutomation.js.map +1 -0
  76. package/dist/tools/deleteAutomation.d.ts +6 -0
  77. package/dist/tools/deleteAutomation.js +14 -0
  78. package/dist/tools/deleteAutomation.js.map +1 -0
  79. package/dist/tools/entityAction.d.ts +6 -0
  80. package/dist/tools/entityAction.js +22 -0
  81. package/dist/tools/entityAction.js.map +1 -0
  82. package/dist/tools/getAllSensors.d.ts +6 -0
  83. package/dist/tools/getAllSensors.js +14 -0
  84. package/dist/tools/getAllSensors.js.map +1 -0
  85. package/dist/tools/getAutomationTrace.d.ts +6 -0
  86. package/dist/tools/getAutomationTrace.js +14 -0
  87. package/dist/tools/getAutomationTrace.js.map +1 -0
  88. package/dist/tools/getDomainSummary.d.ts +6 -0
  89. package/dist/tools/getDomainSummary.js +14 -0
  90. package/dist/tools/getDomainSummary.js.map +1 -0
  91. package/dist/tools/getEntitiesByDomain.d.ts +3 -5
  92. package/dist/tools/getEntitiesByDomain.js +9 -75
  93. package/dist/tools/getEntitiesByDomain.js.map +1 -1
  94. package/dist/tools/getHistory.d.ts +6 -0
  95. package/dist/tools/getHistory.js +14 -0
  96. package/dist/tools/getHistory.js.map +1 -0
  97. package/dist/tools/getState.d.ts +3 -5
  98. package/dist/tools/getState.js +11 -84
  99. package/dist/tools/getState.js.map +1 -1
  100. package/dist/tools/getStates.d.ts +3 -5
  101. package/dist/tools/getStates.js +9 -65
  102. package/dist/tools/getStates.js.map +1 -1
  103. package/dist/tools/getVersion.d.ts +6 -0
  104. package/dist/tools/getVersion.js +14 -0
  105. package/dist/tools/getVersion.js.map +1 -0
  106. package/dist/tools/index.d.ts +6 -7
  107. package/dist/tools/index.js +97 -6
  108. package/dist/tools/index.js.map +1 -1
  109. package/dist/tools/labels.d.ts +12 -0
  110. package/dist/tools/labels.js +139 -0
  111. package/dist/tools/labels.js.map +1 -0
  112. package/dist/tools/listAutomations.d.ts +6 -0
  113. package/dist/tools/listAutomations.js +17 -0
  114. package/dist/tools/listAutomations.js.map +1 -0
  115. package/dist/tools/listEntities.d.ts +6 -0
  116. package/dist/tools/listEntities.js +14 -0
  117. package/dist/tools/listEntities.js.map +1 -0
  118. package/dist/tools/listPersons.d.ts +6 -0
  119. package/dist/tools/listPersons.js +36 -0
  120. package/dist/tools/listPersons.js.map +1 -0
  121. package/dist/tools/sceneAndScript.d.ts +7 -0
  122. package/dist/tools/sceneAndScript.js +32 -0
  123. package/dist/tools/sceneAndScript.js.map +1 -0
  124. package/dist/tools/searchEntities.d.ts +3 -5
  125. package/dist/tools/searchEntities.js +11 -75
  126. package/dist/tools/searchEntities.js.map +1 -1
  127. package/dist/tools/sendNotification.d.ts +8 -0
  128. package/dist/tools/sendNotification.js +160 -0
  129. package/dist/tools/sendNotification.js.map +1 -0
  130. package/dist/tools/systemTools.d.ts +8 -0
  131. package/dist/tools/systemTools.js +32 -0
  132. package/dist/tools/systemTools.js.map +1 -0
  133. package/dist/tools/triggerAutomation.d.ts +6 -0
  134. package/dist/tools/triggerAutomation.js +14 -0
  135. package/dist/tools/triggerAutomation.js.map +1 -0
  136. package/dist/types/automations.d.ts +38 -0
  137. package/dist/types/automations.js +5 -0
  138. package/dist/types/automations.js.map +1 -0
  139. package/dist/types/calendars.d.ts +24 -0
  140. package/dist/types/calendars.js +5 -0
  141. package/dist/types/calendars.js.map +1 -0
  142. package/dist/types/config.d.ts +10 -0
  143. package/dist/types/config.js +5 -0
  144. package/dist/types/config.js.map +1 -0
  145. package/dist/types/entities.d.ts +13 -0
  146. package/dist/types/entities.js +5 -0
  147. package/dist/types/entities.js.map +1 -0
  148. package/dist/types/entity.d.ts +22 -1
  149. package/dist/types/errors.d.ts +0 -1
  150. package/dist/types/haConfig.d.ts +0 -1
  151. package/dist/types/history.d.ts +12 -0
  152. package/dist/types/history.js +5 -0
  153. package/dist/types/history.js.map +1 -0
  154. package/dist/types/index.d.ts +7 -2
  155. package/dist/types/index.js +1 -0
  156. package/dist/types/index.js.map +1 -1
  157. package/dist/types/labels.d.ts +34 -0
  158. package/dist/types/labels.js +5 -0
  159. package/dist/types/labels.js.map +1 -0
  160. package/dist/types/request.d.ts +0 -1
  161. package/dist/types/serviceCall.d.ts +0 -1
  162. package/dist/types/states.d.ts +19 -0
  163. package/dist/types/states.js +5 -0
  164. package/dist/types/states.js.map +1 -0
  165. package/dist/types/updates.d.ts +24 -0
  166. package/dist/types/updates.js +5 -0
  167. package/dist/types/updates.js.map +1 -0
  168. package/dist/types.d.ts +0 -1
  169. package/dist/utils/config-validations.d.ts +0 -1
  170. package/dist/utils/logger.d.ts +0 -1
  171. package/dist/utils/logger.js +2 -1
  172. package/dist/utils/logger.js.map +1 -1
  173. package/dist/wrapper.d.ts +0 -1
  174. package/docs/CHANGELOG.md +114 -85
  175. package/docs/LOCAL_CLIENT.md +572 -268
  176. package/openapi.json +1149 -37
  177. package/package.json +9 -7
  178. package/src/haClient/automations.ts +19 -7
  179. package/src/haClient/calendars.ts +94 -0
  180. package/src/haClient/index.ts +36 -0
  181. package/src/resources/index.ts +159 -211
  182. package/src/server/common.ts +8 -16
  183. package/src/tools/analyzeSensors.ts +33 -0
  184. package/src/tools/automationControls.ts +66 -0
  185. package/src/tools/calendar.ts +97 -0
  186. package/src/tools/callService.ts +16 -105
  187. package/src/tools/common.ts +260 -0
  188. package/src/tools/controlClimate.ts +65 -0
  189. package/src/tools/controlCover.ts +45 -0
  190. package/src/tools/controlFan.ts +41 -0
  191. package/src/tools/controlLight.ts +35 -0
  192. package/src/tools/controlMediaPlayer.ts +47 -0
  193. package/src/tools/createAutomation.ts +35 -0
  194. package/src/tools/deleteAutomation.ts +24 -0
  195. package/src/tools/entityAction.ts +32 -0
  196. package/src/tools/getAllSensors.ts +21 -0
  197. package/src/tools/getAutomationTrace.ts +24 -0
  198. package/src/tools/getDomainSummary.ts +21 -0
  199. package/src/tools/getEntitiesByDomain.ts +15 -86
  200. package/src/tools/getHistory.ts +24 -0
  201. package/src/tools/getState.ts +16 -95
  202. package/src/tools/getStates.ts +14 -73
  203. package/src/tools/getVersion.ts +21 -0
  204. package/src/tools/index.ts +128 -6
  205. package/src/tools/listAutomations.ts +27 -0
  206. package/src/tools/listEntities.ts +24 -0
  207. package/src/tools/listPersons.ts +46 -0
  208. package/src/tools/sceneAndScript.ts +48 -0
  209. package/src/tools/searchEntities.ts +17 -86
  210. package/src/tools/sendNotification.ts +179 -0
  211. package/src/tools/systemTools.ts +52 -0
  212. package/src/tools/triggerAutomation.ts +24 -0
  213. package/src/types/automations.ts +43 -0
  214. package/src/types/calendars.ts +26 -0
  215. package/src/types/config.ts +11 -0
  216. package/src/types/entities.ts +14 -0
  217. package/src/types/history.ts +13 -0
  218. package/src/types/index.ts +37 -1
  219. package/src/types/states.ts +21 -0
  220. package/src/types/updates.ts +28 -0
  221. package/src/utils/logger.ts +2 -1
  222. package/tests/bdd/automation-creation.spec.ts +214 -0
  223. package/tests/bdd/automation-management.spec.ts +267 -0
  224. package/tests/bdd/calendar.spec.ts +190 -0
  225. package/tests/bdd/configuration.spec.ts +283 -0
  226. package/tests/bdd/device-control.spec.ts +344 -0
  227. package/tests/bdd/entity-listing.spec.ts +208 -0
  228. package/tests/bdd/entity-search.spec.ts +183 -0
  229. package/tests/bdd/history-retrieval.spec.ts +195 -0
  230. package/tests/bdd/notifications.spec.ts +238 -0
  231. package/tests/bdd/service-calls.spec.ts +144 -0
  232. package/tests/bdd/state-retrieval.spec.ts +204 -0
  233. package/tests/features/automation-creation.feature +36 -0
  234. package/tests/features/automation-management.feature +54 -0
  235. package/tests/features/calendar.feature +37 -0
  236. package/tests/features/configuration.feature +71 -0
  237. package/tests/features/device-control.feature +100 -0
  238. package/tests/features/entity-listing.feature +51 -0
  239. package/tests/features/entity-search.feature +44 -0
  240. package/tests/features/history-retrieval.feature +38 -0
  241. package/tests/features/notifications.feature +37 -0
  242. package/tests/features/service-calls.feature +35 -0
  243. package/tests/features/state-retrieval.feature +37 -0
  244. package/tests/haClient/index.test.ts +142 -110
  245. package/tests/localAI/index.test.ts +27 -18
  246. package/tests/server/common.test.ts +4 -4
  247. package/tests/server/stdio.test.ts +4 -6
  248. package/tests/tools/registry.test.ts +66 -259
  249. package/tsconfig.json +14 -15
  250. package/vitest.config.ts +1 -1
  251. package/dist/config.d.ts.map +0 -1
  252. package/dist/haClient/automations.d.ts.map +0 -1
  253. package/dist/haClient/config.d.ts.map +0 -1
  254. package/dist/haClient/devices.d.ts.map +0 -1
  255. package/dist/haClient/entities.d.ts.map +0 -1
  256. package/dist/haClient/events.d.ts.map +0 -1
  257. package/dist/haClient/history.d.ts.map +0 -1
  258. package/dist/haClient/index.d.ts.map +0 -1
  259. package/dist/haClient/request.d.ts.map +0 -1
  260. package/dist/haClient/services.d.ts.map +0 -1
  261. package/dist/haClient/states.d.ts.map +0 -1
  262. package/dist/haClient/updates.d.ts.map +0 -1
  263. package/dist/haClient.d.ts +0 -97
  264. package/dist/haClient.d.ts.map +0 -1
  265. package/dist/haClient.js +0 -344
  266. package/dist/haClient.js.map +0 -1
  267. package/dist/index.d.ts.map +0 -1
  268. package/dist/localAI/index.d.ts.map +0 -1
  269. package/dist/localAI/prompts.d.ts.map +0 -1
  270. package/dist/localAI/providers/base.d.ts.map +0 -1
  271. package/dist/localAI/providers/ollama.d.ts.map +0 -1
  272. package/dist/localAI/providers/openai.d.ts.map +0 -1
  273. package/dist/localAI/types.d.ts.map +0 -1
  274. package/dist/ollamaClient.d.ts +0 -37
  275. package/dist/ollamaClient.d.ts.map +0 -1
  276. package/dist/ollamaClient.js +0 -110
  277. package/dist/ollamaClient.js.map +0 -1
  278. package/dist/resources/index.d.ts.map +0 -1
  279. package/dist/server/common.d.ts.map +0 -1
  280. package/dist/server/eventSubscription.d.ts.map +0 -1
  281. package/dist/server/http.d.ts.map +0 -1
  282. package/dist/server/rateLimiter.d.ts.map +0 -1
  283. package/dist/server/sse.d.ts.map +0 -1
  284. package/dist/server/stdio.d.ts.map +0 -1
  285. package/dist/server/stream.d.ts.map +0 -1
  286. package/dist/server.d.ts +0 -8
  287. package/dist/server.d.ts.map +0 -1
  288. package/dist/server.js +0 -30
  289. package/dist/server.js.map +0 -1
  290. package/dist/tools/callService.d.ts.map +0 -1
  291. package/dist/tools/getClient.d.ts +0 -8
  292. package/dist/tools/getClient.d.ts.map +0 -1
  293. package/dist/tools/getClient.js +0 -94
  294. package/dist/tools/getClient.js.map +0 -1
  295. package/dist/tools/getDevice.d.ts +0 -8
  296. package/dist/tools/getDevice.d.ts.map +0 -1
  297. package/dist/tools/getDevice.js +0 -94
  298. package/dist/tools/getDevice.js.map +0 -1
  299. package/dist/tools/getEntitiesByDomain.d.ts.map +0 -1
  300. package/dist/tools/getState.d.ts.map +0 -1
  301. package/dist/tools/getStates.d.ts.map +0 -1
  302. package/dist/tools/index.d.ts.map +0 -1
  303. package/dist/tools/listClients.d.ts +0 -8
  304. package/dist/tools/listClients.d.ts.map +0 -1
  305. package/dist/tools/listClients.js +0 -73
  306. package/dist/tools/listClients.js.map +0 -1
  307. package/dist/tools/listDevices.d.ts +0 -8
  308. package/dist/tools/listDevices.d.ts.map +0 -1
  309. package/dist/tools/listDevices.js +0 -73
  310. package/dist/tools/listDevices.js.map +0 -1
  311. package/dist/tools/listSites.d.ts +0 -8
  312. package/dist/tools/listSites.d.ts.map +0 -1
  313. package/dist/tools/listSites.js +0 -67
  314. package/dist/tools/listSites.js.map +0 -1
  315. package/dist/tools/registry.d.ts +0 -9
  316. package/dist/tools/registry.d.ts.map +0 -1
  317. package/dist/tools/registry.js +0 -1382
  318. package/dist/tools/registry.js.map +0 -1
  319. package/dist/tools/searchDevices.d.ts +0 -8
  320. package/dist/tools/searchDevices.d.ts.map +0 -1
  321. package/dist/tools/searchDevices.js +0 -84
  322. package/dist/tools/searchDevices.js.map +0 -1
  323. package/dist/tools/searchEntities.d.ts.map +0 -1
  324. package/dist/types/entity.d.ts.map +0 -1
  325. package/dist/types/errors.d.ts.map +0 -1
  326. package/dist/types/haConfig.d.ts.map +0 -1
  327. package/dist/types/index.d.ts.map +0 -1
  328. package/dist/types/request.d.ts.map +0 -1
  329. package/dist/types/serviceCall.d.ts.map +0 -1
  330. package/dist/types.d.ts.map +0 -1
  331. package/dist/utils/config-validations.d.ts.map +0 -1
  332. package/dist/utils/logger.d.ts.map +0 -1
  333. package/dist/wrapper.d.ts.map +0 -1
  334. package/src/tools/registry.ts +0 -1521
  335. package/src/types/entity.ts +0 -110
package/README.md CHANGED
@@ -1,38 +1,108 @@
1
1
  # MCP-HA-Connect
2
2
 
3
- A production-ready Model Context Protocol (MCP) server for Home Assistant integration with AI assistants like Claude.
3
+ A production-ready Model Context Protocol (MCP) server for Home Assistant integration with AI assistants like Claude and LM Studio.
4
+
5
+ [![npm version](https://badge.fury.io/js/%40coffeerunhobby%2Fmcp-ha-connect.svg)](https://www.npmjs.com/package/@coffeerunhobby/mcp-ha-connect)
6
+ [![Docker](https://img.shields.io/badge/docker-ghcr.io-blue)](https://github.com/coffeerunhobby/mcp-ha-connect/pkgs/container/mcp-ha-connect)
7
+
8
+ ## Quick Start
9
+
10
+ Choose your preferred installation method:
11
+
12
+ ### Option 1: npx (Recommended - No Installation Required)
13
+
14
+ ```json
15
+ {
16
+ "mcpServers": {
17
+ "homeassistant": {
18
+ "command": "npx",
19
+ "args": ["-y", "@coffeerunhobby/mcp-ha-connect"],
20
+ "env": {
21
+ "HA_URL": "http://homeassistant.10.0.0.19.nip.io:8123",
22
+ "HA_TOKEN": "your_long_lived_access_token"
23
+ }
24
+ }
25
+ }
26
+ }
27
+ ```
4
28
 
5
- ## Version 0.5.0 Features
29
+ ### Option 2: Global npm Install
6
30
 
7
- - **Real-time Updates**: Get instant updates through Server-Sent Events (SSE) - subscribe to state changes, automations, and service calls
8
- - **Device Control**: Control any Home Assistant device through natural language with advanced options
9
- - **Automation Management**: Create, update, delete, trigger, and manage automations programmatically
10
- - **State Monitoring**: Track and query device states in real-time
11
- - **Rate Limiting**: Built-in rate limiting to protect your Home Assistant instance
12
- - **Secure**: Token-based authentication and configurable rate limits
13
- - **Mobile Ready**: Works with any HTTP-capable client
31
+ ```bash
32
+ npm install -g @coffeerunhobby/mcp-ha-connect
33
+ ```
14
34
 
15
- ## Real-time Updates with SSE
35
+ ```json
36
+ {
37
+ "mcpServers": {
38
+ "homeassistant": {
39
+ "command": "mcp-ha-connect",
40
+ "env": {
41
+ "HA_URL": "http://homeassistant.10.0.0.19.nip.io:8123",
42
+ "HA_TOKEN": "your_token"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
16
48
 
17
- The server includes a powerful Server-Sent Events (SSE) system that provides real-time updates from your Home Assistant instance:
49
+ ### Option 3: Docker
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "homeassistant": {
55
+ "command": "docker",
56
+ "args": [
57
+ "run",
58
+ "--rm",
59
+ "-i",
60
+ "-e", "HA_URL=http://host.docker.internal:8123",
61
+ "-e", "HA_TOKEN=your_token",
62
+ "ghcr.io/coffeerunhobby/mcp-ha-connect:latest"
63
+ ]
64
+ }
65
+ }
66
+ }
67
+ ```
18
68
 
19
- - **Get instant state changes** for any device
20
- - **Monitor automation triggers** and executions
21
- - **Subscribe to specific domains** or entities
22
- - **Track service calls** and script executions
69
+ ### Option 4: Local Development
70
+
71
+ ```json
72
+ {
73
+ "mcpServers": {
74
+ "homeassistant": {
75
+ "command": "node",
76
+ "args": ["C:\\workspace\\mcp-homeassistant\\dist\\index.js"],
77
+ "env": {
78
+ "HA_URL": "http://homeassistant.10.0.0.19.nip.io:8123",
79
+ "HA_TOKEN": "your_token"
80
+ }
81
+ }
82
+ }
83
+ }
84
+ ```
23
85
 
24
- ### Quick SSE Example
86
+ ## Configuration Locations
25
87
 
26
- ```javascript
27
- const eventSource = new EventSource(
28
- 'http://mcpserver.10.0.0.18.nip.io:3000/subscribe_events?domain=light'
29
- );
88
+ ### Claude Desktop
89
+ - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
90
+ - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
91
+ - **Linux:** `~/.config/Claude/claude_desktop_config.json`
30
92
 
31
- eventSource.onmessage = (event) => {
32
- const data = JSON.parse(event.data);
33
- console.log('Update received:', data);
34
- };
35
- ```
93
+ ### LM Studio
94
+ - **Windows:** `%USERPROFILE%\.lmstudio\config.json`
95
+ - **macOS:** `~/Library/Application Support/LM Studio/config.json`
96
+ - **Linux:** `~/.config/lmstudio/config.json`
97
+
98
+ ## Autonomous Safety Monitoring System
99
+
100
+ 1. **JS Pre-filter**: Tier A triggers + basic anomaly detection
101
+ 2. **Issue Objects**: Structured alerts (entity, area, threshold, observed, last_changed)
102
+ 3. **LLM Decision**: Single JSON verdict from local model
103
+ 4. **Smart Notifications**: Dedupe + cooldown to prevent alert fatigue
104
+ 5. **Acknowledgment**: HA notification, Telegram, mobile app action, or voice
105
+ 6. **Auto-Response**: Water/gas shutoff via HA valves/switches
36
106
 
37
107
  See [docs/SSE_API.md](docs/SSE_API.md) for complete documentation of the SSE system.
38
108
 
@@ -78,7 +148,7 @@ See [docs/SSE_API.md](docs/SSE_API.md) for complete documentation of the SSE sys
78
148
  - Full type safety with TypeScript
79
149
  - Stateful and stateless session support
80
150
 
81
- ## Available Tools (33 Total)
151
+ ## Available Tools (37 Total)
82
152
 
83
153
  ### State & Entity Tools
84
154
 
@@ -92,6 +162,7 @@ See [docs/SSE_API.md](docs/SSE_API.md) for complete documentation of the SSE sys
92
162
  | `listEntities` | List entities with filtering (domain, state, search, limit) |
93
163
  | `getDomainSummary` | Get summary statistics for a domain |
94
164
  | `getHistory` | Get historical data for an entity |
165
+ | `listPersons` | List all household members with location state (home/away) |
95
166
 
96
167
  ### Service & Control Tools
97
168
 
@@ -111,7 +182,8 @@ See [docs/SSE_API.md](docs/SSE_API.md) for complete documentation of the SSE sys
111
182
  | `controlFan` | Control fans with speed, oscillation, direction |
112
183
  | `activateScene` | Activate a Home Assistant scene |
113
184
  | `runScript` | Run a Home Assistant script |
114
- | `sendNotification` | Send notifications through Home Assistant |
185
+ | `sendNotification` | Send notifications with full mobile app support (actions, priority, images) |
186
+ | `listNotificationTargets` | Discover available mobile app notification targets |
115
187
 
116
188
  ### Automation Tools
117
189
 
@@ -137,6 +209,13 @@ See [docs/SSE_API.md](docs/SSE_API.md) for complete documentation of the SSE sys
137
209
  | `checkUpdates` | Check for available updates |
138
210
  | `analyzeSensors` | AI-powered sensor analysis using Ollama |
139
211
 
212
+ ### Calendar Tools
213
+
214
+ | Tool | Description |
215
+ |------|-------------|
216
+ | `listCalendars` | List all calendar entities |
217
+ | `getCalendarEvents` | Get events from one or all calendars |
218
+
140
219
  ### MCP Resources
141
220
 
142
221
  | Resource URI | Description |
@@ -149,134 +228,232 @@ See [docs/SSE_API.md](docs/SSE_API.md) for complete documentation of the SSE sys
149
228
 
150
229
  ## Prerequisites
151
230
 
152
- - **Node.js 20+** (tested with v20.19.6)
153
- - **npm 10.8+** (tested with v10.8.2)
231
+ - **Node.js 20+** (tested with v20.19.6) - for npm/npx methods
232
+ - **npm 10.8+** (tested with v10.8.2) - for npm/npx methods
233
+ - **Docker** (optional) - for Docker method
154
234
  - Home Assistant instance with long-lived access token
155
235
  - Network access to your Home Assistant instance
156
236
  - (Optional) Ollama for AI-powered analysis
157
- - (Optional) Docker for containerized deployment
158
237
 
159
- ## Configuration
238
+ ## Getting Your Home Assistant Token
160
239
 
161
- ### Getting Long-Lived Access Token
162
-
163
- 1. Log into your Home Assistant
240
+ 1. Log into your Home Assistant instance
164
241
  2. Click on your profile (bottom left)
165
242
  3. Scroll down to "Long-Lived Access Tokens"
166
243
  4. Click "Create Token"
167
244
  5. Give it a name (e.g., "MCP Server")
168
245
  6. Copy the token (shown only once!)
169
246
 
170
- ### Environment Variables
247
+ ## Environment Variables
248
+
249
+ ### Required
250
+
251
+ | Variable | Description | Example |
252
+ |----------|-------------|---------|
253
+ | `HA_URL` | Home Assistant URL | `http://homeassistant.10.0.0.19.nip.io:8123` |
254
+ | `HA_TOKEN` | Long-lived access token | `eyJhbGciOiJIUzI1NiIsInR5cCI...` |
255
+
256
+ ### Optional - Home Assistant
257
+
258
+ | Variable | Default | Description |
259
+ |----------|---------|-------------|
260
+ | `HA_STRICT_SSL` | `true` | Validate SSL certificates |
261
+ | `HA_TIMEOUT` | `30000` | API request timeout (ms) |
262
+
263
+ ### Optional - MCP Server
264
+
265
+ | Variable | Default | Description |
266
+ |----------|---------|-------------|
267
+ | `MCP_SERVER_LOG_LEVEL` | `info` | Log level: `debug`, `info`, `warn`, `error` |
268
+ | `MCP_SERVER_LOG_FORMAT` | `plain` | Log format: `plain`, `json`, `gcp-json` |
269
+ | `MCP_SERVER_USE_HTTP` | `false` | Enable HTTP mode (vs stdio) |
270
+ | `MCP_SERVER_STATEFUL` | `false` | Enable stateful sessions in HTTP mode |
271
+
272
+ ### Optional - HTTP Mode
273
+
274
+ | Variable | Default | Description |
275
+ |----------|---------|-------------|
276
+ | `MCP_HTTP_PORT` | `3000` | HTTP server port |
277
+ | `MCP_HTTP_TRANSPORT` | `stream` | Transport: `stream` or `sse` |
278
+ | `MCP_HTTP_BIND_ADDR` | `127.0.0.1` | Bind address |
279
+ | `MCP_HTTP_PATH` | `/mcp` | MCP endpoint path |
280
+ | `MCP_HTTP_ENABLE_HEALTHCHECK` | `true` | Enable health check endpoint |
281
+ | `MCP_HTTP_HEALTHCHECK_PATH` | `/health` | Health check path |
282
+ | `MCP_HTTP_ALLOW_CORS` | `true` | Enable CORS |
283
+ | `MCP_HTTP_ALLOWED_ORIGINS` | `127.0.0.1,localhost` | Allowed CORS origins |
284
+
285
+ ### Optional - SSE Events
286
+
287
+ | Variable | Default | Description |
288
+ |----------|---------|-------------|
289
+ | `MCP_SSE_EVENTS_ENABLED` | `false` | Enable real-time SSE events |
290
+ | `MCP_SSE_EVENTS_PATH` | `/subscribe_events` | SSE endpoint path |
291
+
292
+ ### Optional - Rate Limiting
293
+
294
+ | Variable | Default | Description |
295
+ |----------|---------|-------------|
296
+ | `MCP_RATE_LIMIT_ENABLED` | `false` | Enable rate limiting |
297
+ | `MCP_RATE_LIMIT_WINDOW_MS` | `60000` | Rate limit window (ms) |
298
+ | `MCP_RATE_LIMIT_MAX_REQUESTS` | `100` | Max requests per window |
299
+
300
+ ### Optional - AI Provider
301
+
302
+ | Variable | Default | Description |
303
+ |----------|---------|-------------|
304
+ | `AI_PROVIDER` | `ollama` | AI provider: `ollama`, `openai`, or `none` |
305
+ | `AI_URL` | `http://ollama.10.0.0.17.nip.io:11434` | AI server URL (Ollama) |
306
+ | `AI_MODEL` | `llama2` | AI model name |
307
+ | `AI_TIMEOUT` | `60000` | AI request timeout (ms) |
308
+
309
+ ## Advanced Configuration Examples
310
+
311
+ ### With AI Analysis (Ollama)
312
+
313
+ ```json
314
+ {
315
+ "mcpServers": {
316
+ "homeassistant": {
317
+ "command": "npx",
318
+ "args": ["-y", "@coffeerunhobby/mcp-ha-connect"],
319
+ "env": {
320
+ "HA_URL": "http://homeassistant.10.0.0.19.nip.io:8123",
321
+ "HA_TOKEN": "your_token",
322
+ "AI_PROVIDER": "ollama",
323
+ "AI_URL": "http://ollama.10.0.0.17.nip.io:11434",
324
+ "AI_MODEL": "llama2"
325
+ }
326
+ }
327
+ }
328
+ }
329
+ ```
171
330
 
172
- Copy `.env.example` to `.env` and configure:
331
+ ### Disable AI Features
332
+
333
+ ```json
334
+ {
335
+ "mcpServers": {
336
+ "homeassistant": {
337
+ "command": "npx",
338
+ "args": ["-y", "@coffeerunhobby/mcp-ha-connect"],
339
+ "env": {
340
+ "HA_URL": "http://homeassistant.10.0.0.19.nip.io:8123",
341
+ "HA_TOKEN": "your_token",
342
+ "AI_PROVIDER": "none"
343
+ }
344
+ }
345
+ }
346
+ }
347
+ ```
173
348
 
174
- ```bash
175
- # Home Assistant Connection
176
- HA_URL=http://homeassistant.10.0.0.19.nip.io:8123
177
- HA_TOKEN=your_long_lived_access_token_here
178
- HA_STRICT_SSL=false
179
- HA_TIMEOUT=30000
180
-
181
- # MCP Server Configuration
182
- MCP_SERVER_LOG_LEVEL=info # debug, info, warn, error
183
- MCP_SERVER_LOG_FORMAT=plain # plain, json, gcp-json
184
- MCP_SERVER_USE_HTTP=false # true for HTTP mode, false for stdio
185
- MCP_SERVER_STATEFUL=false # Enable stateful sessions in HTTP mode
186
-
187
- # HTTP Configuration (when MCP_SERVER_USE_HTTP=true)
188
- MCP_HTTP_PORT=3000
189
- MCP_HTTP_TRANSPORT=stream # stream or sse
190
- MCP_HTTP_BIND_ADDR=127.0.0.1
191
- MCP_HTTP_PATH=/mcp # /mcp for stream, /sse for SSE
192
- MCP_HTTP_ENABLE_HEALTHCHECK=true
193
- MCP_HTTP_HEALTHCHECK_PATH=/health
194
- MCP_HTTP_ALLOW_CORS=true
195
- MCP_HTTP_ALLOWED_ORIGINS=127.0.0.1,localhost
196
-
197
- # SSE Event Subscription (real-time updates)
198
- MCP_SSE_EVENTS_ENABLED=true # Enable SSE event subscription
199
- MCP_SSE_EVENTS_PATH=/subscribe_events # SSE endpoint path
200
-
201
- # Rate Limiting
202
- MCP_RATE_LIMIT_ENABLED=true # Enable rate limiting
203
- MCP_RATE_LIMIT_WINDOW_MS=60000 # Time window in ms (default: 1 minute)
204
- MCP_RATE_LIMIT_MAX_REQUESTS=100 # Max requests per window
205
-
206
- # AI Configuration (optional)
207
- AI_PROVIDER=ollama # ollama or openai
208
- AI_URL=http://ollama.10.0.0.17.nip.io:11434
209
- AI_MODEL=phi4:14b
210
- AI_TIMEOUT=60000
349
+ ### Docker with Network Configuration
350
+
351
+ For Linux, you may need to add `host.docker.internal`:
352
+
353
+ ```json
354
+ {
355
+ "mcpServers": {
356
+ "homeassistant": {
357
+ "command": "docker",
358
+ "args": [
359
+ "run",
360
+ "--rm",
361
+ "-i",
362
+ "--add-host=host.docker.internal:host-gateway",
363
+ "-e", "HA_URL=http://host.docker.internal:8123",
364
+ "-e", "HA_TOKEN=your_token",
365
+ "ghcr.io/coffeerunhobby/mcp-ha-connect:latest"
366
+ ]
367
+ }
368
+ }
369
+ }
211
370
  ```
212
371
 
213
- ## Usage
372
+ ## Usage Modes
373
+
374
+ ### Mode 1: MCP Client (Claude Desktop / LM Studio)
214
375
 
215
- ### Mode 1: Claude Desktop (Stdio Transport)
376
+ Default stdio mode for MCP clients. See [Quick Start](#quick-start) section for configuration.
216
377
 
217
- [`docs/LOCAL_CLIENT.md`](docs/LOCAL_CLIENT.md)
378
+ For detailed configuration options, see [docs/LOCAL_CLIENT.md](docs/LOCAL_CLIENT.md).
218
379
 
219
380
  ### Mode 2: HTTP Server
220
381
 
382
+ Start as standalone HTTP server for web applications:
383
+
221
384
  ```bash
222
- # Start HTTP server
223
- MCP_SERVER_USE_HTTP=true npm start
385
+ # Using npx
386
+ npx @coffeerunhobby/mcp-ha-connect
387
+
388
+ # Or with environment variables
389
+ MCP_SERVER_USE_HTTP=true \
390
+ MCP_HTTP_PORT=3000 \
391
+ HA_URL=http://homeassistant.10.0.0.19.nip.io:8123 \
392
+ HA_TOKEN=your_token \
393
+ npx @coffeerunhobby/mcp-ha-connect
224
394
  ```
225
395
 
226
- #### Streamable HTTP Transport (Recommended)
396
+ #### Streamable HTTP Transport
227
397
 
228
398
  Configure your MCP client to use:
229
- - **URL:** `http://mcpserver.10.0.0.18.nip.io:3000/mcp`
399
+ - **URL:** `http://localhost:3000/mcp`
230
400
  - **Transport:** Streamable HTTP (MCP 2025-03-26)
231
401
 
232
402
  #### SSE Event Subscription
233
403
 
234
404
  Subscribe to real-time events:
235
- - **URL:** `http://mcpserver.10.0.0.18.nip.io:3000/subscribe_events`
236
- - **Method:** GET
237
- - **Query params:** `domain`, `entity_id`, `event_types`
238
405
 
239
- ### Mode 3: Docker
406
+ ```javascript
407
+ const eventSource = new EventSource(
408
+ 'http://localhost:3000/subscribe_events?domain=light&entity_id=light.living_room'
409
+ );
410
+
411
+ eventSource.addEventListener('state_changed', (event) => {
412
+ const data = JSON.parse(event.data);
413
+ console.log('Entity changed:', data.entity_id, data.new_state);
414
+ });
415
+ ```
416
+
417
+ See [docs/SSE_API.md](docs/SSE_API.md) for complete SSE documentation.
418
+
419
+ ### Mode 3: Docker Standalone
240
420
 
241
421
  ```bash
242
- # Build image
243
- docker build -t mcp-ha-connect .
422
+ # Pull image
423
+ docker pull ghcr.io/coffeerunhobby/mcp-ha-connect:latest
244
424
 
245
- # Run container
425
+ # Run in HTTP mode
246
426
  docker run -d --name mcp-ha-connect \
247
427
  -e HA_URL=http://homeassistant.10.0.0.19.nip.io:8123 \
248
428
  -e HA_TOKEN=your_token \
249
429
  -e MCP_SERVER_USE_HTTP=true \
250
430
  -p 3000:3000 \
251
- mcp-ha-connect
431
+ ghcr.io/coffeerunhobby/mcp-ha-connect:latest
252
432
  ```
253
433
 
254
- ## Development
255
-
256
- ### Running Tests
257
-
258
- ```bash
259
- npm test # Run all tests
260
- npm run test:watch # Watch mode
261
- npm run test:coverage # Coverage report
262
- ```
263
-
264
- ### Type Checking
265
-
266
- ```bash
267
- npm run type-check
268
- ```
269
-
270
- ### Linting
271
-
272
- ```bash
273
- npm run lint
274
- ```
275
-
276
- ### Building
277
-
278
- ```bash
279
- npm run build
434
+ ### Mode 4: Docker Compose
435
+
436
+ ```yaml
437
+ version: '3.8'
438
+
439
+ services:
440
+ mcp-ha-connect:
441
+ image: ghcr.io/coffeerunhobby/mcp-ha-connect:latest
442
+ container_name: mcp-ha-connect
443
+ restart: unless-stopped
444
+ ports:
445
+ - "3000:3000"
446
+ environment:
447
+ - HA_URL=http://homeassistant.10.0.0.19.nip.io:8123
448
+ - HA_TOKEN=${HA_TOKEN}
449
+ - MCP_SERVER_USE_HTTP=true
450
+ - MCP_HTTP_BIND_ADDR=0.0.0.0
451
+ networks:
452
+ - home-automation
453
+
454
+ networks:
455
+ home-automation:
456
+ driver: bridge
280
457
  ```
281
458
 
282
459
  ## Integration Examples
@@ -326,56 +503,151 @@ docker exec -it n8n n8n list:workflow
326
503
 
327
504
  Use the HTTP transport with your MCP-compatible web client:
328
505
 
329
- 1. Configure client to use `http://mcpserver.10.0.0.18.nip.io:3000/mcp`
330
- 2. Set transport to Streamable HTTP (MCP 2025-03-26)
331
- 3. Enable CORS by adding your origin to `MCP_HTTP_ALLOWED_ORIGINS`
332
-
333
- ### With Stateful Sessions
334
-
335
- Enable session persistence:
336
-
337
- ```bash
338
- MCP_SERVER_STATEFUL=true
506
+ 1. Start server in HTTP mode
507
+ 2. Configure client to use `http://localhost:3000/mcp`
508
+ 3. Set transport to Streamable HTTP (MCP 2025-03-26)
509
+ 4. Enable CORS by adding your origin to `MCP_HTTP_ALLOWED_ORIGINS`
510
+
511
+ ### With Remote MCP Proxy (uvx)
512
+
513
+ Connect to a remote MCP server using mcp-remote:
514
+
515
+ ```json
516
+ {
517
+ "mcpServers": {
518
+ "homeassistant": {
519
+ "command": "uvx",
520
+ "args": [
521
+ "mcp-remote",
522
+ "http://your-server:3000/mcp"
523
+ ]
524
+ }
525
+ }
526
+ }
339
527
  ```
340
528
 
341
- Your MCP client should:
342
- 1. Include `Mcp-Session-Id` header in requests
343
- 2. Reuse the same session ID for related requests
344
- 3. Session state is maintained server-side
529
+ ## Network Configuration Notes
345
530
 
346
- Connect to SSE for real-time updates
531
+ - **`host.docker.internal`** - Use this to access services on your host machine from Docker
532
+ - Works on Windows and macOS by default
533
+ - On Linux, add `--add-host=host.docker.internal:host-gateway` to docker args
534
+ - **Direct IP** - Use your machine's IP address (e.g., `http://10.0.0.19:8123`)
535
+ - **nip.io domains** - Use wildcard DNS for easy local development (e.g., `http://homeassistant.10.0.0.19.nip.io:8123`)
347
536
 
348
- ```javascript
349
- const eventSource = new EventSource(
350
- 'http://mcpserver.10.0.0.18.nip.io:3000/subscribe_events?domain=light'
351
- );
352
-
353
- eventSource.addEventListener('state_changed', (event) => {
354
- const data = JSON.parse(event.data);
355
- updateUI(data.entity_id, data.new_state);
356
- });
357
- ```
358
-
359
- ## Security
537
+ ## Security Best Practices
360
538
 
361
539
  ### Network Security
362
540
 
363
- **Network Segmentation:**
364
- - Run MCP server on private LAN only (192.168.0.0/24)
365
- - Use Docker networks for container isolation
366
- - Consider VLAN for IoT devices
367
- - Never expose MCP server directly to internet
541
+ - **Network Segmentation**: Run MCP server on private LAN only
542
+ - **Docker Networks**: Use Docker networks for container isolation
543
+ - **VLAN**: Consider VLAN for IoT devices
544
+ - **No Internet Exposure**: Never expose MCP server directly to internet
368
545
 
369
- ### Best Practices
546
+ ### Token & Configuration Security
370
547
 
371
548
  - Store `.env` securely (contains access token)
372
- - Never commit `.env` to version control
549
+ - **Never** commit `.env` to version control
373
550
  - Set `.env` permissions: `chmod 600 .env`
374
551
  - Use `HA_STRICT_SSL=true` for HTTPS in production
375
552
  - Rotate access tokens periodically
376
- - Restrict `MCP_HTTP_ALLOWED_ORIGINS` (avoid wildcard)
553
+ - Restrict `MCP_HTTP_ALLOWED_ORIGINS` (avoid wildcard `*`)
377
554
  - Bind to `127.0.0.1` for local-only access
378
- - Enable rate limiting in production
555
+ - Enable rate limiting in production (`MCP_RATE_LIMIT_ENABLED=true`)
556
+
557
+ ### MCP Client Configuration Security
558
+
559
+ ⚠️ **Important:** Storing tokens directly in MCP client config files (Claude Desktop, LM Studio) exposes them to anyone with filesystem access. Consider:
560
+
561
+ - Using `.env` files with restricted permissions for Docker/local deployments
562
+ - Setting file permissions on config files (e.g., `chmod 600`)
563
+ - Using environment variable substitution if supported by your client
564
+ - Never committing config files with real tokens to version control
565
+
566
+ ## Troubleshooting
567
+
568
+ ### Claude Desktop / LM Studio Not Connecting
569
+
570
+ 1. **Check config file location** - Verify you're editing the correct file
571
+ 2. **Restart the application** - Close and reopen after config changes
572
+ 3. **Check logs** - Look for error messages in the application logs
573
+ 4. **Test connection manually**:
574
+
575
+ ```bash
576
+ # Test npx
577
+ npx @coffeerunhobby/mcp-ha-connect
578
+
579
+ # Test Docker
580
+ docker run --rm -i \
581
+ -e HA_URL=http://homeassistant.10.0.0.19.nip.io:8123 \
582
+ -e HA_TOKEN=your_token \
583
+ ghcr.io/coffeerunhobby/mcp-ha-connect:latest
584
+ ```
585
+
586
+ ### Docker `host.docker.internal` Not Working (Linux)
587
+
588
+ Add host gateway:
589
+
590
+ ```json
591
+ {
592
+ "args": [
593
+ "run",
594
+ "--rm",
595
+ "-i",
596
+ "--add-host=host.docker.internal:host-gateway",
597
+ "-e", "HA_URL=http://host.docker.internal:8123",
598
+ ...
599
+ ]
600
+ }
601
+ ```
602
+
603
+ ### Home Assistant Connection Issues
604
+
605
+ 1. **Verify URL** - Try accessing `http://your-ha-url:8123/api/` in browser
606
+ 2. **Check token** - Ensure it's a valid long-lived access token
607
+ 3. **Network access** - Verify MCP server can reach Home Assistant
608
+ 4. **SSL issues** - Try `HA_STRICT_SSL=false` for testing
609
+
610
+ ### AI Analysis Not Working
611
+
612
+ 1. **Verify Ollama is running** - `curl http://your-ollama-url:11434/api/tags`
613
+ 2. **Check model is available** - Ensure model is pulled: `ollama pull llama2`
614
+ 3. **Set AI_PROVIDER** - Must be set to `ollama` (not `none`)
615
+
616
+ ## Development
617
+
618
+ ### Setup
619
+
620
+ ```bash
621
+ # Clone repository
622
+ git clone https://github.com/coffeerunhobby/mcp-ha-connect.git
623
+ cd mcp-ha-connect
624
+
625
+ # Install dependencies
626
+ npm install
627
+
628
+ # Copy environment template
629
+ cp .env.example .env
630
+
631
+ # Edit .env with your Home Assistant details
632
+ nano .env
633
+
634
+ # Build
635
+ npm run build
636
+
637
+ # Run
638
+ npm start
639
+ ```
640
+
641
+ ### Available Scripts
642
+
643
+ ```bash
644
+ npm run build # Build TypeScript to dist/
645
+ npm run dev # Run in development mode with watch
646
+ npm start # Run built version
647
+ npm test # Run tests
648
+ npm run lint # Run ESLint
649
+ npm run format # Format code with Prettier
650
+ ```
379
651
 
380
652
  ## License
381
653
 
@@ -383,12 +655,24 @@ MIT
383
655
 
384
656
  ## Author
385
657
 
386
- Coffee Run Hobby (github.com/coffeerunhobby)
658
+ Coffee Run Hobby ([github.com/coffeerunhobby](https://github.com/coffeerunhobby))
387
659
 
388
660
  ## Version
389
661
 
390
- 0.5.0
662
+ 0.7.0
663
+
664
+ ## Links
665
+
666
+ - **GitHub**: [https://github.com/coffeerunhobby/mcp-ha-connect](https://github.com/coffeerunhobby/mcp-ha-connect)
667
+ - **npm**: [https://www.npmjs.com/package/@coffeerunhobby/mcp-ha-connect](https://www.npmjs.com/package/@coffeerunhobby/mcp-ha-connect)
668
+ - **Docker**: [https://github.com/coffeerunhobby/mcp-ha-connect/pkgs/container/mcp-ha-connect](https://github.com/coffeerunhobby/mcp-ha-connect/pkgs/container/mcp-ha-connect)
669
+
670
+ ## Documentation
671
+
672
+ - [Changelog](docs/CHANGELOG.md)
673
+ - [Local Client Configuration](docs/LOCAL_CLIENT.md)
674
+ - [SSE Event API](docs/SSE_API.md)
391
675
 
392
- ## Changelog
676
+ ## Contributing
393
677
 
394
- [`docs/CHANGELOG.md`](docs/CHANGELOG.md)
678
+ Contributions are welcome! Please feel free to submit a Pull Request.