@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.
- package/README.md +11 -59
- package/dist/config.d.ts +0 -1
- package/dist/haClient/automations.d.ts +1 -2
- package/dist/haClient/automations.js +17 -7
- package/dist/haClient/automations.js.map +1 -1
- package/dist/haClient/config.d.ts +0 -1
- package/dist/haClient/devices.d.ts +0 -1
- package/dist/haClient/entities.d.ts +0 -1
- package/dist/haClient/events.d.ts +0 -1
- package/dist/haClient/history.d.ts +0 -1
- package/dist/haClient/index.d.ts +0 -1
- package/dist/haClient/request.d.ts +0 -1
- package/dist/haClient/services.d.ts +0 -1
- package/dist/haClient/states.d.ts +0 -1
- package/dist/haClient/updates.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/localAI/index.d.ts +0 -1
- package/dist/localAI/prompts.d.ts +0 -1
- package/dist/localAI/providers/base.d.ts +0 -1
- package/dist/localAI/providers/ollama.d.ts +0 -1
- package/dist/localAI/providers/openai.d.ts +0 -1
- package/dist/localAI/types.d.ts +0 -1
- package/dist/resources/index.d.ts +2 -3
- package/dist/resources/index.js +132 -200
- package/dist/resources/index.js.map +1 -1
- package/dist/server/common.d.ts +2 -3
- package/dist/server/common.js +5 -10
- package/dist/server/common.js.map +1 -1
- package/dist/server/eventSubscription.d.ts +0 -1
- package/dist/server/http.d.ts +0 -1
- package/dist/server/rateLimiter.d.ts +0 -1
- package/dist/server/sse.d.ts +0 -1
- package/dist/server/stdio.d.ts +0 -1
- package/dist/server/stream.d.ts +0 -1
- package/dist/tools/analyzeSensors.d.ts +6 -0
- package/dist/tools/analyzeSensors.js +23 -0
- package/dist/tools/analyzeSensors.js.map +1 -0
- package/dist/tools/automationControls.d.ts +9 -0
- package/dist/tools/automationControls.js +41 -0
- package/dist/tools/automationControls.js.map +1 -0
- package/dist/tools/callService.d.ts +3 -5
- package/dist/tools/callService.js +11 -94
- package/dist/tools/callService.js.map +1 -1
- package/dist/tools/common.d.ts +389 -0
- package/dist/tools/common.js +213 -0
- package/dist/tools/common.js.map +1 -0
- package/dist/tools/controlClimate.d.ts +6 -0
- package/dist/tools/controlClimate.js +50 -0
- package/dist/tools/controlClimate.js.map +1 -0
- package/dist/tools/controlCover.d.ts +6 -0
- package/dist/tools/controlCover.js +33 -0
- package/dist/tools/controlCover.js.map +1 -0
- package/dist/tools/controlFan.d.ts +6 -0
- package/dist/tools/controlFan.js +34 -0
- package/dist/tools/controlFan.js.map +1 -0
- package/dist/tools/controlLight.d.ts +6 -0
- package/dist/tools/controlLight.js +28 -0
- package/dist/tools/controlLight.js.map +1 -0
- package/dist/tools/controlMediaPlayer.d.ts +6 -0
- package/dist/tools/controlMediaPlayer.js +35 -0
- package/dist/tools/controlMediaPlayer.js.map +1 -0
- package/dist/tools/createAutomation.d.ts +6 -0
- package/dist/tools/createAutomation.js +24 -0
- package/dist/tools/createAutomation.js.map +1 -0
- package/dist/tools/deleteAutomation.d.ts +6 -0
- package/dist/tools/deleteAutomation.js +14 -0
- package/dist/tools/deleteAutomation.js.map +1 -0
- package/dist/tools/entityAction.d.ts +6 -0
- package/dist/tools/entityAction.js +22 -0
- package/dist/tools/entityAction.js.map +1 -0
- package/dist/tools/getAllSensors.d.ts +6 -0
- package/dist/tools/getAllSensors.js +14 -0
- package/dist/tools/getAllSensors.js.map +1 -0
- package/dist/tools/getAutomationTrace.d.ts +6 -0
- package/dist/tools/getAutomationTrace.js +14 -0
- package/dist/tools/getAutomationTrace.js.map +1 -0
- package/dist/tools/getDomainSummary.d.ts +6 -0
- package/dist/tools/getDomainSummary.js +14 -0
- package/dist/tools/getDomainSummary.js.map +1 -0
- package/dist/tools/getEntitiesByDomain.d.ts +3 -5
- package/dist/tools/getEntitiesByDomain.js +9 -75
- package/dist/tools/getEntitiesByDomain.js.map +1 -1
- package/dist/tools/getHistory.d.ts +6 -0
- package/dist/tools/getHistory.js +14 -0
- package/dist/tools/getHistory.js.map +1 -0
- package/dist/tools/getState.d.ts +3 -5
- package/dist/tools/getState.js +11 -84
- package/dist/tools/getState.js.map +1 -1
- package/dist/tools/getStates.d.ts +3 -5
- package/dist/tools/getStates.js +9 -65
- package/dist/tools/getStates.js.map +1 -1
- package/dist/tools/getVersion.d.ts +6 -0
- package/dist/tools/getVersion.js +14 -0
- package/dist/tools/getVersion.js.map +1 -0
- package/dist/tools/index.d.ts +6 -7
- package/dist/tools/index.js +80 -6
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listAutomations.d.ts +6 -0
- package/dist/tools/listAutomations.js +17 -0
- package/dist/tools/listAutomations.js.map +1 -0
- package/dist/tools/listEntities.d.ts +6 -0
- package/dist/tools/listEntities.js +14 -0
- package/dist/tools/listEntities.js.map +1 -0
- package/dist/tools/sceneAndScript.d.ts +7 -0
- package/dist/tools/sceneAndScript.js +32 -0
- package/dist/tools/sceneAndScript.js.map +1 -0
- package/dist/tools/searchEntities.d.ts +3 -5
- package/dist/tools/searchEntities.js +9 -75
- package/dist/tools/searchEntities.js.map +1 -1
- package/dist/tools/sendNotification.d.ts +8 -0
- package/dist/tools/sendNotification.js +160 -0
- package/dist/tools/sendNotification.js.map +1 -0
- package/dist/tools/systemTools.d.ts +8 -0
- package/dist/tools/systemTools.js +32 -0
- package/dist/tools/systemTools.js.map +1 -0
- package/dist/tools/triggerAutomation.d.ts +6 -0
- package/dist/tools/triggerAutomation.js +14 -0
- package/dist/tools/triggerAutomation.js.map +1 -0
- package/dist/types/entity.d.ts +1 -1
- package/dist/types/errors.d.ts +0 -1
- package/dist/types/haConfig.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/request.d.ts +0 -1
- package/dist/types/serviceCall.d.ts +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/utils/config-validations.d.ts +0 -1
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +2 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/wrapper.d.ts +0 -1
- package/docs/CHANGELOG.md +19 -0
- package/docs/LOCAL_CLIENT.md +98 -28
- package/package.json +6 -5
- package/src/haClient/automations.ts +19 -7
- package/src/resources/index.ts +159 -211
- package/src/server/common.ts +8 -16
- package/src/tools/analyzeSensors.ts +33 -0
- package/src/tools/automationControls.ts +66 -0
- package/src/tools/callService.ts +16 -105
- package/src/tools/common.ts +249 -0
- package/src/tools/controlClimate.ts +65 -0
- package/src/tools/controlCover.ts +45 -0
- package/src/tools/controlFan.ts +41 -0
- package/src/tools/controlLight.ts +35 -0
- package/src/tools/controlMediaPlayer.ts +47 -0
- package/src/tools/createAutomation.ts +35 -0
- package/src/tools/deleteAutomation.ts +24 -0
- package/src/tools/entityAction.ts +32 -0
- package/src/tools/getAllSensors.ts +21 -0
- package/src/tools/getAutomationTrace.ts +24 -0
- package/src/tools/getDomainSummary.ts +21 -0
- package/src/tools/getEntitiesByDomain.ts +15 -86
- package/src/tools/getHistory.ts +24 -0
- package/src/tools/getState.ts +16 -95
- package/src/tools/getStates.ts +14 -73
- package/src/tools/getVersion.ts +21 -0
- package/src/tools/index.ts +107 -6
- package/src/tools/listAutomations.ts +27 -0
- package/src/tools/listEntities.ts +24 -0
- package/src/tools/sceneAndScript.ts +48 -0
- package/src/tools/searchEntities.ts +15 -86
- package/src/tools/sendNotification.ts +179 -0
- package/src/tools/systemTools.ts +52 -0
- package/src/tools/triggerAutomation.ts +24 -0
- package/src/types/entity.ts +1 -0
- package/src/utils/logger.ts +2 -1
- package/tests/server/common.test.ts +4 -4
- package/tests/tools/registry.test.ts +66 -259
- package/tsconfig.json +14 -15
- package/dist/config.d.ts.map +0 -1
- package/dist/haClient/automations.d.ts.map +0 -1
- package/dist/haClient/config.d.ts.map +0 -1
- package/dist/haClient/devices.d.ts.map +0 -1
- package/dist/haClient/entities.d.ts.map +0 -1
- package/dist/haClient/events.d.ts.map +0 -1
- package/dist/haClient/history.d.ts.map +0 -1
- package/dist/haClient/index.d.ts.map +0 -1
- package/dist/haClient/request.d.ts.map +0 -1
- package/dist/haClient/services.d.ts.map +0 -1
- package/dist/haClient/states.d.ts.map +0 -1
- package/dist/haClient/updates.d.ts.map +0 -1
- package/dist/haClient.d.ts +0 -97
- package/dist/haClient.d.ts.map +0 -1
- package/dist/haClient.js +0 -344
- package/dist/haClient.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/localAI/index.d.ts.map +0 -1
- package/dist/localAI/prompts.d.ts.map +0 -1
- package/dist/localAI/providers/base.d.ts.map +0 -1
- package/dist/localAI/providers/ollama.d.ts.map +0 -1
- package/dist/localAI/providers/openai.d.ts.map +0 -1
- package/dist/localAI/types.d.ts.map +0 -1
- package/dist/ollamaClient.d.ts +0 -37
- package/dist/ollamaClient.d.ts.map +0 -1
- package/dist/ollamaClient.js +0 -110
- package/dist/ollamaClient.js.map +0 -1
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/server/common.d.ts.map +0 -1
- package/dist/server/eventSubscription.d.ts.map +0 -1
- package/dist/server/http.d.ts.map +0 -1
- package/dist/server/rateLimiter.d.ts.map +0 -1
- package/dist/server/sse.d.ts.map +0 -1
- package/dist/server/stdio.d.ts.map +0 -1
- package/dist/server/stream.d.ts.map +0 -1
- package/dist/server.d.ts +0 -8
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -30
- package/dist/server.js.map +0 -1
- package/dist/tools/callService.d.ts.map +0 -1
- package/dist/tools/getClient.d.ts +0 -8
- package/dist/tools/getClient.d.ts.map +0 -1
- package/dist/tools/getClient.js +0 -94
- package/dist/tools/getClient.js.map +0 -1
- package/dist/tools/getDevice.d.ts +0 -8
- package/dist/tools/getDevice.d.ts.map +0 -1
- package/dist/tools/getDevice.js +0 -94
- package/dist/tools/getDevice.js.map +0 -1
- package/dist/tools/getEntitiesByDomain.d.ts.map +0 -1
- package/dist/tools/getState.d.ts.map +0 -1
- package/dist/tools/getStates.d.ts.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/listClients.d.ts +0 -8
- package/dist/tools/listClients.d.ts.map +0 -1
- package/dist/tools/listClients.js +0 -73
- package/dist/tools/listClients.js.map +0 -1
- package/dist/tools/listDevices.d.ts +0 -8
- package/dist/tools/listDevices.d.ts.map +0 -1
- package/dist/tools/listDevices.js +0 -73
- package/dist/tools/listDevices.js.map +0 -1
- package/dist/tools/listSites.d.ts +0 -8
- package/dist/tools/listSites.d.ts.map +0 -1
- package/dist/tools/listSites.js +0 -67
- package/dist/tools/listSites.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -9
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -1382
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/searchDevices.d.ts +0 -8
- package/dist/tools/searchDevices.d.ts.map +0 -1
- package/dist/tools/searchDevices.js +0 -84
- package/dist/tools/searchDevices.js.map +0 -1
- package/dist/tools/searchEntities.d.ts.map +0 -1
- package/dist/types/entity.d.ts.map +0 -1
- package/dist/types/errors.d.ts.map +0 -1
- package/dist/types/haConfig.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/request.d.ts.map +0 -1
- package/dist/types/serviceCall.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/config-validations.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/wrapper.d.ts.map +0 -1
- package/src/tools/registry.ts +0 -1521
package/dist/resources/index.js
CHANGED
|
@@ -2,236 +2,168 @@
|
|
|
2
2
|
* MCP Resources Registry
|
|
3
3
|
* Provides URI-based access to Home Assistant entities
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
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
|
|
13
|
-
server.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
57
|
-
server.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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: '
|
|
58
|
+
text: JSON.stringify({ error: 'Entity not found', entity_id: entityId }),
|
|
213
59
|
},
|
|
214
60
|
],
|
|
215
61
|
};
|
|
216
62
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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":"AAAA;;;GAGG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/common.d.ts
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Common MCP server creation
|
|
3
3
|
* Shared across all transport types (stdio, SSE, stream)
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
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):
|
|
9
|
-
//# sourceMappingURL=common.d.ts.map
|
|
8
|
+
export declare function createServer(client: HaClient, aiClient?: LocalAIClient): McpServer;
|
package/dist/server/common.js
CHANGED
|
@@ -2,26 +2,21 @@
|
|
|
2
2
|
* Common MCP server creation
|
|
3
3
|
* Shared across all transport types (stdio, SSE, stream)
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import { registerAllTools } from '../tools/
|
|
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
|
|
11
|
+
const server = new McpServer({
|
|
12
12
|
name: 'mcp-ha-connect',
|
|
13
|
-
version: '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
|
|
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,
|
|
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"}
|
package/dist/server/http.d.ts
CHANGED
package/dist/server/sse.d.ts
CHANGED
package/dist/server/stdio.d.ts
CHANGED
package/dist/server/stream.d.ts
CHANGED
|
@@ -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
|
|
3
|
-
* Calls a Home Assistant service
|
|
2
|
+
* callService tool - Call a Home Assistant service
|
|
4
3
|
*/
|
|
5
|
-
import {
|
|
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:
|
|
8
|
-
//# sourceMappingURL=callService.d.ts.map
|
|
6
|
+
export declare function registerCallServiceTool(server: McpServer, client: HaClient): void;
|