@coffeerunhobby/mcp-ha-connect 0.5.0 → 0.6.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 (253) hide show
  1. package/README.md +11 -59
  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/config.d.ts +0 -1
  7. package/dist/haClient/devices.d.ts +0 -1
  8. package/dist/haClient/entities.d.ts +0 -1
  9. package/dist/haClient/events.d.ts +0 -1
  10. package/dist/haClient/history.d.ts +0 -1
  11. package/dist/haClient/index.d.ts +0 -1
  12. package/dist/haClient/request.d.ts +0 -1
  13. package/dist/haClient/services.d.ts +0 -1
  14. package/dist/haClient/states.d.ts +0 -1
  15. package/dist/haClient/updates.d.ts +0 -1
  16. package/dist/index.d.ts +0 -1
  17. package/dist/localAI/index.d.ts +0 -1
  18. package/dist/localAI/prompts.d.ts +0 -1
  19. package/dist/localAI/providers/base.d.ts +0 -1
  20. package/dist/localAI/providers/ollama.d.ts +0 -1
  21. package/dist/localAI/providers/openai.d.ts +0 -1
  22. package/dist/localAI/types.d.ts +0 -1
  23. package/dist/resources/index.d.ts +2 -3
  24. package/dist/resources/index.js +132 -200
  25. package/dist/resources/index.js.map +1 -1
  26. package/dist/server/common.d.ts +2 -3
  27. package/dist/server/common.js +5 -10
  28. package/dist/server/common.js.map +1 -1
  29. package/dist/server/eventSubscription.d.ts +0 -1
  30. package/dist/server/http.d.ts +0 -1
  31. package/dist/server/rateLimiter.d.ts +0 -1
  32. package/dist/server/sse.d.ts +0 -1
  33. package/dist/server/stdio.d.ts +0 -1
  34. package/dist/server/stream.d.ts +0 -1
  35. package/dist/tools/analyzeSensors.d.ts +6 -0
  36. package/dist/tools/analyzeSensors.js +23 -0
  37. package/dist/tools/analyzeSensors.js.map +1 -0
  38. package/dist/tools/automationControls.d.ts +9 -0
  39. package/dist/tools/automationControls.js +41 -0
  40. package/dist/tools/automationControls.js.map +1 -0
  41. package/dist/tools/callService.d.ts +3 -5
  42. package/dist/tools/callService.js +11 -94
  43. package/dist/tools/callService.js.map +1 -1
  44. package/dist/tools/common.d.ts +389 -0
  45. package/dist/tools/common.js +213 -0
  46. package/dist/tools/common.js.map +1 -0
  47. package/dist/tools/controlClimate.d.ts +6 -0
  48. package/dist/tools/controlClimate.js +50 -0
  49. package/dist/tools/controlClimate.js.map +1 -0
  50. package/dist/tools/controlCover.d.ts +6 -0
  51. package/dist/tools/controlCover.js +33 -0
  52. package/dist/tools/controlCover.js.map +1 -0
  53. package/dist/tools/controlFan.d.ts +6 -0
  54. package/dist/tools/controlFan.js +34 -0
  55. package/dist/tools/controlFan.js.map +1 -0
  56. package/dist/tools/controlLight.d.ts +6 -0
  57. package/dist/tools/controlLight.js +28 -0
  58. package/dist/tools/controlLight.js.map +1 -0
  59. package/dist/tools/controlMediaPlayer.d.ts +6 -0
  60. package/dist/tools/controlMediaPlayer.js +35 -0
  61. package/dist/tools/controlMediaPlayer.js.map +1 -0
  62. package/dist/tools/createAutomation.d.ts +6 -0
  63. package/dist/tools/createAutomation.js +24 -0
  64. package/dist/tools/createAutomation.js.map +1 -0
  65. package/dist/tools/deleteAutomation.d.ts +6 -0
  66. package/dist/tools/deleteAutomation.js +14 -0
  67. package/dist/tools/deleteAutomation.js.map +1 -0
  68. package/dist/tools/entityAction.d.ts +6 -0
  69. package/dist/tools/entityAction.js +22 -0
  70. package/dist/tools/entityAction.js.map +1 -0
  71. package/dist/tools/getAllSensors.d.ts +6 -0
  72. package/dist/tools/getAllSensors.js +14 -0
  73. package/dist/tools/getAllSensors.js.map +1 -0
  74. package/dist/tools/getAutomationTrace.d.ts +6 -0
  75. package/dist/tools/getAutomationTrace.js +14 -0
  76. package/dist/tools/getAutomationTrace.js.map +1 -0
  77. package/dist/tools/getDomainSummary.d.ts +6 -0
  78. package/dist/tools/getDomainSummary.js +14 -0
  79. package/dist/tools/getDomainSummary.js.map +1 -0
  80. package/dist/tools/getEntitiesByDomain.d.ts +3 -5
  81. package/dist/tools/getEntitiesByDomain.js +9 -75
  82. package/dist/tools/getEntitiesByDomain.js.map +1 -1
  83. package/dist/tools/getHistory.d.ts +6 -0
  84. package/dist/tools/getHistory.js +14 -0
  85. package/dist/tools/getHistory.js.map +1 -0
  86. package/dist/tools/getState.d.ts +3 -5
  87. package/dist/tools/getState.js +11 -84
  88. package/dist/tools/getState.js.map +1 -1
  89. package/dist/tools/getStates.d.ts +3 -5
  90. package/dist/tools/getStates.js +9 -65
  91. package/dist/tools/getStates.js.map +1 -1
  92. package/dist/tools/getVersion.d.ts +6 -0
  93. package/dist/tools/getVersion.js +14 -0
  94. package/dist/tools/getVersion.js.map +1 -0
  95. package/dist/tools/index.d.ts +6 -7
  96. package/dist/tools/index.js +80 -6
  97. package/dist/tools/index.js.map +1 -1
  98. package/dist/tools/listAutomations.d.ts +6 -0
  99. package/dist/tools/listAutomations.js +17 -0
  100. package/dist/tools/listAutomations.js.map +1 -0
  101. package/dist/tools/listEntities.d.ts +6 -0
  102. package/dist/tools/listEntities.js +14 -0
  103. package/dist/tools/listEntities.js.map +1 -0
  104. package/dist/tools/sceneAndScript.d.ts +7 -0
  105. package/dist/tools/sceneAndScript.js +32 -0
  106. package/dist/tools/sceneAndScript.js.map +1 -0
  107. package/dist/tools/searchEntities.d.ts +3 -5
  108. package/dist/tools/searchEntities.js +9 -75
  109. package/dist/tools/searchEntities.js.map +1 -1
  110. package/dist/tools/sendNotification.d.ts +8 -0
  111. package/dist/tools/sendNotification.js +160 -0
  112. package/dist/tools/sendNotification.js.map +1 -0
  113. package/dist/tools/systemTools.d.ts +8 -0
  114. package/dist/tools/systemTools.js +32 -0
  115. package/dist/tools/systemTools.js.map +1 -0
  116. package/dist/tools/triggerAutomation.d.ts +6 -0
  117. package/dist/tools/triggerAutomation.js +14 -0
  118. package/dist/tools/triggerAutomation.js.map +1 -0
  119. package/dist/types/entity.d.ts +1 -1
  120. package/dist/types/errors.d.ts +0 -1
  121. package/dist/types/haConfig.d.ts +0 -1
  122. package/dist/types/index.d.ts +0 -1
  123. package/dist/types/request.d.ts +0 -1
  124. package/dist/types/serviceCall.d.ts +0 -1
  125. package/dist/types.d.ts +0 -1
  126. package/dist/utils/config-validations.d.ts +0 -1
  127. package/dist/utils/logger.d.ts +0 -1
  128. package/dist/utils/logger.js +2 -1
  129. package/dist/utils/logger.js.map +1 -1
  130. package/dist/wrapper.d.ts +0 -1
  131. package/docs/CHANGELOG.md +19 -0
  132. package/docs/LOCAL_CLIENT.md +98 -28
  133. package/package.json +6 -5
  134. package/src/haClient/automations.ts +19 -7
  135. package/src/resources/index.ts +159 -211
  136. package/src/server/common.ts +8 -16
  137. package/src/tools/analyzeSensors.ts +33 -0
  138. package/src/tools/automationControls.ts +66 -0
  139. package/src/tools/callService.ts +16 -105
  140. package/src/tools/common.ts +249 -0
  141. package/src/tools/controlClimate.ts +65 -0
  142. package/src/tools/controlCover.ts +45 -0
  143. package/src/tools/controlFan.ts +41 -0
  144. package/src/tools/controlLight.ts +35 -0
  145. package/src/tools/controlMediaPlayer.ts +47 -0
  146. package/src/tools/createAutomation.ts +35 -0
  147. package/src/tools/deleteAutomation.ts +24 -0
  148. package/src/tools/entityAction.ts +32 -0
  149. package/src/tools/getAllSensors.ts +21 -0
  150. package/src/tools/getAutomationTrace.ts +24 -0
  151. package/src/tools/getDomainSummary.ts +21 -0
  152. package/src/tools/getEntitiesByDomain.ts +15 -86
  153. package/src/tools/getHistory.ts +24 -0
  154. package/src/tools/getState.ts +16 -95
  155. package/src/tools/getStates.ts +14 -73
  156. package/src/tools/getVersion.ts +21 -0
  157. package/src/tools/index.ts +107 -6
  158. package/src/tools/listAutomations.ts +27 -0
  159. package/src/tools/listEntities.ts +24 -0
  160. package/src/tools/sceneAndScript.ts +48 -0
  161. package/src/tools/searchEntities.ts +15 -86
  162. package/src/tools/sendNotification.ts +179 -0
  163. package/src/tools/systemTools.ts +52 -0
  164. package/src/tools/triggerAutomation.ts +24 -0
  165. package/src/types/entity.ts +1 -0
  166. package/src/utils/logger.ts +2 -1
  167. package/tests/server/common.test.ts +4 -4
  168. package/tests/tools/registry.test.ts +66 -259
  169. package/tsconfig.json +14 -15
  170. package/dist/config.d.ts.map +0 -1
  171. package/dist/haClient/automations.d.ts.map +0 -1
  172. package/dist/haClient/config.d.ts.map +0 -1
  173. package/dist/haClient/devices.d.ts.map +0 -1
  174. package/dist/haClient/entities.d.ts.map +0 -1
  175. package/dist/haClient/events.d.ts.map +0 -1
  176. package/dist/haClient/history.d.ts.map +0 -1
  177. package/dist/haClient/index.d.ts.map +0 -1
  178. package/dist/haClient/request.d.ts.map +0 -1
  179. package/dist/haClient/services.d.ts.map +0 -1
  180. package/dist/haClient/states.d.ts.map +0 -1
  181. package/dist/haClient/updates.d.ts.map +0 -1
  182. package/dist/haClient.d.ts +0 -97
  183. package/dist/haClient.d.ts.map +0 -1
  184. package/dist/haClient.js +0 -344
  185. package/dist/haClient.js.map +0 -1
  186. package/dist/index.d.ts.map +0 -1
  187. package/dist/localAI/index.d.ts.map +0 -1
  188. package/dist/localAI/prompts.d.ts.map +0 -1
  189. package/dist/localAI/providers/base.d.ts.map +0 -1
  190. package/dist/localAI/providers/ollama.d.ts.map +0 -1
  191. package/dist/localAI/providers/openai.d.ts.map +0 -1
  192. package/dist/localAI/types.d.ts.map +0 -1
  193. package/dist/ollamaClient.d.ts +0 -37
  194. package/dist/ollamaClient.d.ts.map +0 -1
  195. package/dist/ollamaClient.js +0 -110
  196. package/dist/ollamaClient.js.map +0 -1
  197. package/dist/resources/index.d.ts.map +0 -1
  198. package/dist/server/common.d.ts.map +0 -1
  199. package/dist/server/eventSubscription.d.ts.map +0 -1
  200. package/dist/server/http.d.ts.map +0 -1
  201. package/dist/server/rateLimiter.d.ts.map +0 -1
  202. package/dist/server/sse.d.ts.map +0 -1
  203. package/dist/server/stdio.d.ts.map +0 -1
  204. package/dist/server/stream.d.ts.map +0 -1
  205. package/dist/server.d.ts +0 -8
  206. package/dist/server.d.ts.map +0 -1
  207. package/dist/server.js +0 -30
  208. package/dist/server.js.map +0 -1
  209. package/dist/tools/callService.d.ts.map +0 -1
  210. package/dist/tools/getClient.d.ts +0 -8
  211. package/dist/tools/getClient.d.ts.map +0 -1
  212. package/dist/tools/getClient.js +0 -94
  213. package/dist/tools/getClient.js.map +0 -1
  214. package/dist/tools/getDevice.d.ts +0 -8
  215. package/dist/tools/getDevice.d.ts.map +0 -1
  216. package/dist/tools/getDevice.js +0 -94
  217. package/dist/tools/getDevice.js.map +0 -1
  218. package/dist/tools/getEntitiesByDomain.d.ts.map +0 -1
  219. package/dist/tools/getState.d.ts.map +0 -1
  220. package/dist/tools/getStates.d.ts.map +0 -1
  221. package/dist/tools/index.d.ts.map +0 -1
  222. package/dist/tools/listClients.d.ts +0 -8
  223. package/dist/tools/listClients.d.ts.map +0 -1
  224. package/dist/tools/listClients.js +0 -73
  225. package/dist/tools/listClients.js.map +0 -1
  226. package/dist/tools/listDevices.d.ts +0 -8
  227. package/dist/tools/listDevices.d.ts.map +0 -1
  228. package/dist/tools/listDevices.js +0 -73
  229. package/dist/tools/listDevices.js.map +0 -1
  230. package/dist/tools/listSites.d.ts +0 -8
  231. package/dist/tools/listSites.d.ts.map +0 -1
  232. package/dist/tools/listSites.js +0 -67
  233. package/dist/tools/listSites.js.map +0 -1
  234. package/dist/tools/registry.d.ts +0 -9
  235. package/dist/tools/registry.d.ts.map +0 -1
  236. package/dist/tools/registry.js +0 -1382
  237. package/dist/tools/registry.js.map +0 -1
  238. package/dist/tools/searchDevices.d.ts +0 -8
  239. package/dist/tools/searchDevices.d.ts.map +0 -1
  240. package/dist/tools/searchDevices.js +0 -84
  241. package/dist/tools/searchDevices.js.map +0 -1
  242. package/dist/tools/searchEntities.d.ts.map +0 -1
  243. package/dist/types/entity.d.ts.map +0 -1
  244. package/dist/types/errors.d.ts.map +0 -1
  245. package/dist/types/haConfig.d.ts.map +0 -1
  246. package/dist/types/index.d.ts.map +0 -1
  247. package/dist/types/request.d.ts.map +0 -1
  248. package/dist/types/serviceCall.d.ts.map +0 -1
  249. package/dist/types.d.ts.map +0 -1
  250. package/dist/utils/config-validations.d.ts.map +0 -1
  251. package/dist/utils/logger.d.ts.map +0 -1
  252. package/dist/wrapper.d.ts.map +0 -1
  253. package/src/tools/registry.ts +0 -1521
@@ -2,236 +2,168 @@
2
2
  * MCP Resources Registry
3
3
  * Provides URI-based access to Home Assistant entities
4
4
  */
5
- import { ListResourcesRequestSchema, ReadResourceRequestSchema, ListResourceTemplatesRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import { logger } from '../utils/logger.js';
7
7
  /**
8
8
  * Register all Home Assistant resources with the MCP server
9
9
  */
10
10
  export function registerAllResources(server, client) {
11
11
  logger.debug('Registering MCP resources');
12
- // List available resource templates
13
- server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
14
- return {
15
- resourceTemplates: [
16
- {
17
- uriTemplate: 'hass://entities/{entity_id}',
18
- name: 'Entity State',
19
- description: 'Get the current state of a specific Home Assistant entity',
20
- mimeType: 'application/json',
21
- },
22
- {
23
- uriTemplate: 'hass://entities/{entity_id}/detailed',
24
- name: 'Entity Detailed',
25
- description: 'Get detailed information about an entity including all attributes',
26
- mimeType: 'application/json',
27
- },
28
- {
29
- uriTemplate: 'hass://entities/domain/{domain}',
30
- name: 'Domain Entities',
31
- description: 'Get all entities for a specific domain',
32
- mimeType: 'application/json',
33
- },
34
- {
35
- uriTemplate: 'hass://search/{query}/{limit}',
36
- name: 'Search Entities',
37
- description: 'Search for entities matching a query with result limit',
38
- mimeType: 'application/json',
39
- },
40
- ],
41
- };
42
- });
43
- // List concrete resources (the static entities resource)
44
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
12
+ // Static resource: List all entities grouped by domain
13
+ server.resource('All Entities', 'hass://entities', {
14
+ description: 'List all Home Assistant entities grouped by domain',
15
+ mimeType: 'application/json',
16
+ }, async () => {
17
+ const entities = await client.getStates();
18
+ // Group by domain
19
+ const grouped = {};
20
+ for (const entity of entities) {
21
+ const domain = entity.entity_id.split('.')[0];
22
+ if (!grouped[domain]) {
23
+ grouped[domain] = [];
24
+ }
25
+ grouped[domain].push({
26
+ entity_id: entity.entity_id,
27
+ state: entity.state,
28
+ friendly_name: entity.attributes.friendly_name,
29
+ });
30
+ }
45
31
  return {
46
- resources: [
32
+ contents: [
47
33
  {
48
34
  uri: 'hass://entities',
49
- name: 'All Entities',
50
- description: 'List all Home Assistant entities grouped by domain',
51
35
  mimeType: 'application/json',
36
+ text: JSON.stringify({
37
+ total: entities.length,
38
+ domains: Object.keys(grouped).length,
39
+ entities: grouped,
40
+ }, null, 2),
52
41
  },
53
42
  ],
54
43
  };
55
44
  });
56
- // Read resource content
57
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
58
- const uri = request.params.uri;
59
- logger.debug('Reading resource', { uri });
60
- try {
61
- // Parse the URI
62
- const url = new URL(uri);
63
- const path = url.pathname;
64
- // hass://entities - List all entities grouped by domain
65
- if (uri === 'hass://entities') {
66
- const entities = await client.getStates();
67
- // Group by domain
68
- const grouped = {};
69
- for (const entity of entities) {
70
- const domain = entity.entity_id.split('.')[0];
71
- if (!grouped[domain]) {
72
- grouped[domain] = [];
73
- }
74
- grouped[domain].push({
75
- entity_id: entity.entity_id,
76
- state: entity.state,
77
- friendly_name: entity.attributes.friendly_name,
78
- });
79
- }
80
- return {
81
- contents: [
82
- {
83
- uri,
84
- mimeType: 'application/json',
85
- text: JSON.stringify({
86
- total: entities.length,
87
- domains: Object.keys(grouped).length,
88
- entities: grouped,
89
- }, null, 2),
90
- },
91
- ],
92
- };
93
- }
94
- // hass://entities/{entity_id}/detailed - Detailed entity info
95
- if (path.endsWith('/detailed')) {
96
- const entityId = path.replace('/detailed', '').replace(/^\//, '');
97
- const entity = await client.getState(entityId);
98
- if (!entity) {
99
- return {
100
- contents: [
101
- {
102
- uri,
103
- mimeType: 'application/json',
104
- text: JSON.stringify({ error: 'Entity not found', entity_id: entityId }),
105
- },
106
- ],
107
- };
108
- }
109
- return {
110
- contents: [
111
- {
112
- uri,
113
- mimeType: 'application/json',
114
- text: JSON.stringify({
115
- entity_id: entity.entity_id,
116
- state: entity.state,
117
- attributes: entity.attributes,
118
- last_changed: entity.last_changed,
119
- last_updated: entity.last_updated,
120
- context: entity.context,
121
- }, null, 2),
122
- },
123
- ],
124
- };
125
- }
126
- // hass://entities/domain/{domain} - Entities by domain
127
- if (path.startsWith('/domain/')) {
128
- const domain = path.replace('/domain/', '');
129
- const entities = await client.getEntitiesByDomain(domain);
130
- return {
131
- contents: [
132
- {
133
- uri,
134
- mimeType: 'application/json',
135
- text: JSON.stringify({
136
- domain,
137
- count: entities.length,
138
- entities: entities.map(e => ({
139
- entity_id: e.entity_id,
140
- state: e.state,
141
- friendly_name: e.attributes.friendly_name,
142
- })),
143
- }, null, 2),
144
- },
145
- ],
146
- };
147
- }
148
- // hass://search/{query}/{limit} - Search entities
149
- if (path.startsWith('/search/')) {
150
- const parts = path.replace('/search/', '').split('/');
151
- const query = decodeURIComponent(parts[0] || '');
152
- const limit = parseInt(parts[1] || '50', 10);
153
- let entities = await client.searchEntities(query);
154
- if (limit > 0) {
155
- entities = entities.slice(0, limit);
156
- }
157
- return {
158
- contents: [
159
- {
160
- uri,
161
- mimeType: 'application/json',
162
- text: JSON.stringify({
163
- query,
164
- limit,
165
- count: entities.length,
166
- entities: entities.map(e => ({
167
- entity_id: e.entity_id,
168
- state: e.state,
169
- friendly_name: e.attributes.friendly_name,
170
- })),
171
- }, null, 2),
172
- },
173
- ],
174
- };
175
- }
176
- // hass://entities/{entity_id} - Simple entity state
177
- const entityId = path.replace(/^\//, '');
178
- if (entityId && !entityId.includes('/')) {
179
- const entity = await client.getState(entityId);
180
- if (!entity) {
181
- return {
182
- contents: [
183
- {
184
- uri,
185
- mimeType: 'application/json',
186
- text: JSON.stringify({ error: 'Entity not found', entity_id: entityId }),
187
- },
188
- ],
189
- };
190
- }
191
- return {
192
- contents: [
193
- {
194
- uri,
195
- mimeType: 'application/json',
196
- text: JSON.stringify({
197
- entity_id: entity.entity_id,
198
- state: entity.state,
199
- friendly_name: entity.attributes.friendly_name,
200
- last_changed: entity.last_changed,
201
- }, null, 2),
202
- },
203
- ],
204
- };
205
- }
206
- // Unknown resource
45
+ // Template resource: Get specific entity state
46
+ server.resource('Entity State', new ResourceTemplate('hass://entities/{entity_id}', { list: undefined }), {
47
+ description: 'Get the current state of a specific Home Assistant entity',
48
+ mimeType: 'application/json',
49
+ }, async (uri, variables) => {
50
+ const entityId = variables.entity_id;
51
+ const entity = await client.getState(entityId);
52
+ if (!entity) {
207
53
  return {
208
54
  contents: [
209
55
  {
210
- uri,
56
+ uri: uri.href,
211
57
  mimeType: 'application/json',
212
- text: JSON.stringify({ error: 'Unknown resource', uri }),
58
+ text: JSON.stringify({ error: 'Entity not found', entity_id: entityId }),
213
59
  },
214
60
  ],
215
61
  };
216
62
  }
217
- catch (error) {
218
- logger.error('Failed to read resource', {
219
- uri,
220
- error: error instanceof Error ? error.message : String(error),
221
- });
63
+ return {
64
+ contents: [
65
+ {
66
+ uri: uri.href,
67
+ mimeType: 'application/json',
68
+ text: JSON.stringify({
69
+ entity_id: entity.entity_id,
70
+ state: entity.state,
71
+ friendly_name: entity.attributes.friendly_name,
72
+ last_changed: entity.last_changed,
73
+ }, null, 2),
74
+ },
75
+ ],
76
+ };
77
+ });
78
+ // Template resource: Get detailed entity info
79
+ server.resource('Entity Detailed', new ResourceTemplate('hass://entities/{entity_id}/detailed', { list: undefined }), {
80
+ description: 'Get detailed information about an entity including all attributes',
81
+ mimeType: 'application/json',
82
+ }, async (uri, variables) => {
83
+ const entityId = variables.entity_id;
84
+ const entity = await client.getState(entityId);
85
+ if (!entity) {
222
86
  return {
223
87
  contents: [
224
88
  {
225
- uri,
89
+ uri: uri.href,
226
90
  mimeType: 'application/json',
227
- text: JSON.stringify({
228
- error: 'Failed to read resource',
229
- message: error instanceof Error ? error.message : String(error),
230
- }),
91
+ text: JSON.stringify({ error: 'Entity not found', entity_id: entityId }),
231
92
  },
232
93
  ],
233
94
  };
234
95
  }
96
+ return {
97
+ contents: [
98
+ {
99
+ uri: uri.href,
100
+ mimeType: 'application/json',
101
+ text: JSON.stringify({
102
+ entity_id: entity.entity_id,
103
+ state: entity.state,
104
+ attributes: entity.attributes,
105
+ last_changed: entity.last_changed,
106
+ last_updated: entity.last_updated,
107
+ context: entity.context,
108
+ }, null, 2),
109
+ },
110
+ ],
111
+ };
112
+ });
113
+ // Template resource: Get entities by domain
114
+ server.resource('Domain Entities', new ResourceTemplate('hass://entities/domain/{domain}', { list: undefined }), {
115
+ description: 'Get all entities for a specific domain',
116
+ mimeType: 'application/json',
117
+ }, async (uri, variables) => {
118
+ const domain = variables.domain;
119
+ const entities = await client.getEntitiesByDomain(domain);
120
+ return {
121
+ contents: [
122
+ {
123
+ uri: uri.href,
124
+ mimeType: 'application/json',
125
+ text: JSON.stringify({
126
+ domain,
127
+ count: entities.length,
128
+ entities: entities.map(e => ({
129
+ entity_id: e.entity_id,
130
+ state: e.state,
131
+ friendly_name: e.attributes.friendly_name,
132
+ })),
133
+ }, null, 2),
134
+ },
135
+ ],
136
+ };
137
+ });
138
+ // Template resource: Search entities
139
+ server.resource('Search Entities', new ResourceTemplate('hass://search/{query}/{limit}', { list: undefined }), {
140
+ description: 'Search for entities matching a query with result limit',
141
+ mimeType: 'application/json',
142
+ }, async (uri, variables) => {
143
+ const queryStr = decodeURIComponent(variables.query);
144
+ const limitNum = parseInt(variables.limit || '50', 10);
145
+ let entities = await client.searchEntities(queryStr);
146
+ if (limitNum > 0) {
147
+ entities = entities.slice(0, limitNum);
148
+ }
149
+ return {
150
+ contents: [
151
+ {
152
+ uri: uri.href,
153
+ mimeType: 'application/json',
154
+ text: JSON.stringify({
155
+ query: queryStr,
156
+ limit: limitNum,
157
+ count: entities.length,
158
+ entities: entities.map(e => ({
159
+ entity_id: e.entity_id,
160
+ state: e.state,
161
+ friendly_name: e.attributes.friendly_name,
162
+ })),
163
+ }, null, 2),
164
+ },
165
+ ],
166
+ };
235
167
  });
236
168
  logger.info('MCP resources registered successfully', { resourceCount: 5 });
237
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,7 @@
2
2
  * Common MCP server creation
3
3
  * Shared across all transport types (stdio, SSE, stream)
4
4
  */
5
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
6
  import type { HaClient } from '../haClient/index.js';
7
7
  import type { LocalAIClient } from '../localAI/index.js';
8
- export declare function createServer(client: HaClient, aiClient?: LocalAIClient): Server;
9
- //# sourceMappingURL=common.d.ts.map
8
+ export declare function createServer(client: HaClient, aiClient?: LocalAIClient): McpServer;
@@ -2,26 +2,21 @@
2
2
  * Common MCP server creation
3
3
  * Shared across all transport types (stdio, SSE, stream)
4
4
  */
5
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
- import { registerAllTools } from '../tools/registry.js';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { registerAllTools } from '../tools/index.js';
7
7
  import { registerAllResources } from '../resources/index.js';
8
8
  import { logger } from '../utils/logger.js';
9
9
  export function createServer(client, aiClient) {
10
10
  logger.debug('Creating MCP server instance');
11
- const server = new Server({
11
+ const server = new McpServer({
12
12
  name: 'mcp-ha-connect',
13
- version: '0.4.0',
14
- }, {
15
- capabilities: {
16
- tools: {},
17
- resources: {},
18
- },
13
+ version: '0.5.0',
19
14
  });
20
15
  // Register all Home Assistant tools
21
16
  registerAllTools(server, client, aiClient);
22
17
  // Register all Home Assistant resources
23
18
  registerAllResources(server, client);
24
- logger.debug('MCP server instance created with 15 tools and 5 resources registered');
19
+ logger.debug('MCP server instance created');
25
20
  return server;
26
21
  }
27
22
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/server/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,MAAgB,EAAE,QAAwB;IACrE,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;SACd;KACF,CACF,CAAC;IAEF,oCAAoC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE3C,wCAAwC;IACxC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAErF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/server/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,MAAgB,EAAE,QAAwB;IACrE,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,oCAAoC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE3C,wCAAwC;IACxC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -50,4 +50,3 @@ export declare function disconnectClient(clientId: string): boolean;
50
50
  * Disconnect all clients
51
51
  */
52
52
  export declare function disconnectAllClients(): number;
53
- //# sourceMappingURL=eventSubscription.d.ts.map
@@ -9,4 +9,3 @@ import type { LocalAIClient } from '../localAI/index.js';
9
9
  * Start HTTP server
10
10
  */
11
11
  export declare function startHttpServer(client: HaClient, config: EnvironmentConfig, aiClient?: LocalAIClient): Promise<void>;
12
- //# sourceMappingURL=http.d.ts.map
@@ -67,4 +67,3 @@ export declare class RateLimiter {
67
67
  * Create a rate limiter instance with default config
68
68
  */
69
69
  export declare function createRateLimiter(config?: RateLimitConfig): RateLimiter;
70
- //# sourceMappingURL=rateLimiter.d.ts.map
@@ -29,4 +29,3 @@ export declare function handleSseMessage(transport: SSEServerTransport, req: Inc
29
29
  */
30
30
  export declare function getSseMessagePath(): string;
31
31
  export type { SSETransportState };
32
- //# sourceMappingURL=sse.d.ts.map
@@ -5,4 +5,3 @@
5
5
  import type { HaClient } from '../haClient/index.js';
6
6
  import type { LocalAIClient } from '../localAI/index.js';
7
7
  export declare function startStdioServer(client: HaClient, aiClient?: LocalAIClient): Promise<void>;
8
- //# sourceMappingURL=stdio.d.ts.map
@@ -23,4 +23,3 @@ export declare function createStreamTransport(client: HaClient, config: Environm
23
23
  * For stateful mode, transports should be stored and reused by the caller
24
24
  */
25
25
  export declare function handleStreamRequest(client: HaClient, config: EnvironmentConfig, req: IncomingMessage, res: ServerResponse, parsedBody?: unknown, existingTransport?: StreamTransportState, aiClient?: LocalAIClient): Promise<StreamTransportState | void>;
26
- //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * analyzeSensors tool - AI-powered sensor analysis
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { LocalAIClient } from '../localAI/index.js';
6
+ export declare function registerAnalyzeSensorsTool(server: McpServer, aiClient?: LocalAIClient): void;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * analyzeSensors tool - AI-powered sensor analysis
3
+ */
4
+ import { analyzeSensorsSchema, toToolResult, wrapToolHandler } from './common.js';
5
+ export function registerAnalyzeSensorsTool(server, aiClient) {
6
+ server.registerTool('analyzeSensors', {
7
+ description: 'Analyze sensor data using AI (Ollama) to detect issues and provide recommendations.',
8
+ inputSchema: analyzeSensorsSchema.shape,
9
+ }, wrapToolHandler('analyzeSensors', async ({ sensors }) => {
10
+ if (!aiClient) {
11
+ return toToolResult({
12
+ error: 'AI client not configured',
13
+ message: 'AI analysis requires AI_URL to be set (or legacy OLLAMA_URL)',
14
+ }, true);
15
+ }
16
+ if (!sensors || typeof sensors !== 'object') {
17
+ return toToolResult({ error: 'sensors object is required' }, true);
18
+ }
19
+ const analysis = await aiClient.analyzeSensors(sensors);
20
+ return toToolResult(analysis);
21
+ }));
22
+ }
23
+ //# sourceMappingURL=analyzeSensors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeSensors.js","sourceRoot":"","sources":["../../src/tools/analyzeSensors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKlF,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,QAAwB;IACpF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EAAE,qFAAqF;QAClG,WAAW,EAAE,oBAAoB,CAAC,KAAK;KACxC,EACD,eAAe,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAsB,EAAE,EAAE;QAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,YAAY,CAAC;gBAClB,KAAK,EAAE,0BAA0B;gBACjC,OAAO,EAAE,8DAA8D;aACxE,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAqB,CAAC,CAAC;QACtE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Automation control tools - Enable, disable, toggle, reload automations
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { HaClient } from '../haClient/index.js';
6
+ export declare function registerEnableAutomationTool(server: McpServer, client: HaClient): void;
7
+ export declare function registerDisableAutomationTool(server: McpServer, client: HaClient): void;
8
+ export declare function registerToggleAutomationTool(server: McpServer, client: HaClient): void;
9
+ export declare function registerReloadAutomationsTool(server: McpServer, client: HaClient): void;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Automation control tools - Enable, disable, toggle, reload automations
3
+ */
4
+ import { entityIdSchema, emptySchema, toToolResult, wrapToolHandler } from './common.js';
5
+ export function registerEnableAutomationTool(server, client) {
6
+ server.registerTool('enableAutomation', {
7
+ description: 'Enable a disabled Home Assistant automation.',
8
+ inputSchema: entityIdSchema.shape,
9
+ }, wrapToolHandler('enableAutomation', async ({ entity_id }) => {
10
+ const result = await client.enableAutomation(entity_id);
11
+ return toToolResult({ success: true, entity_id, action: 'enabled', context: result.context });
12
+ }));
13
+ }
14
+ export function registerDisableAutomationTool(server, client) {
15
+ server.registerTool('disableAutomation', {
16
+ description: 'Disable a Home Assistant automation.',
17
+ inputSchema: entityIdSchema.shape,
18
+ }, wrapToolHandler('disableAutomation', async ({ entity_id }) => {
19
+ const result = await client.disableAutomation(entity_id);
20
+ return toToolResult({ success: true, entity_id, action: 'disabled', context: result.context });
21
+ }));
22
+ }
23
+ export function registerToggleAutomationTool(server, client) {
24
+ server.registerTool('toggleAutomation', {
25
+ description: 'Toggle a Home Assistant automation (enable if disabled, disable if enabled).',
26
+ inputSchema: entityIdSchema.shape,
27
+ }, wrapToolHandler('toggleAutomation', async ({ entity_id }) => {
28
+ const result = await client.toggleAutomation(entity_id);
29
+ return toToolResult({ success: true, entity_id, action: 'toggled', context: result.context });
30
+ }));
31
+ }
32
+ export function registerReloadAutomationsTool(server, client) {
33
+ server.registerTool('reloadAutomations', {
34
+ description: 'Reload all automations from the Home Assistant configuration. Useful after editing automation YAML files.',
35
+ inputSchema: emptySchema.shape,
36
+ }, wrapToolHandler('reloadAutomations', async () => {
37
+ await client.reloadAutomations();
38
+ return toToolResult({ success: true, message: 'Automations reloaded from configuration' });
39
+ }));
40
+ }
41
+ //# sourceMappingURL=automationControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automationControls.js","sourceRoot":"","sources":["../../src/tools/automationControls.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKzF,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,MAAgB;IAC9E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,cAAc,CAAC,KAAK;KAClC,EACD,eAAe,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAgB,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACxD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAiB,EAAE,MAAgB;IAC/E,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,cAAc,CAAC,KAAK;KAClC,EACD,eAAe,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAgB,EAAE,EAAE;QACzE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjG,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,MAAgB;IAC9E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE,cAAc,CAAC,KAAK;KAClC,EACD,eAAe,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAgB,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACxD,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAiB,EAAE,MAAgB;IAC/E,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE,WAAW,CAAC,KAAK;KAC/B,EACD,eAAe,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAC;IAC7F,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -1,8 +1,6 @@
1
1
  /**
2
- * Call Service Tool
3
- * Calls a Home Assistant service
2
+ * callService tool - Call a Home Assistant service
4
3
  */
5
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
5
  import type { HaClient } from '../haClient/index.js';
7
- export declare function registerCallServiceTool(server: Server, client: HaClient): void;
8
- //# sourceMappingURL=callService.d.ts.map
6
+ export declare function registerCallServiceTool(server: McpServer, client: HaClient): void;