@coffeerunhobby/mcp-ha-connect 2.2.1 → 2.3.1
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/.env.example +1 -1
- package/README.md +11 -2
- package/dist/omadaClient/client.d.ts +6 -1
- package/dist/omadaClient/client.js +12 -1
- package/dist/omadaClient/client.js.map +1 -1
- package/dist/omadaClient/diagnose.d.ts +68 -0
- package/dist/omadaClient/diagnose.js +164 -0
- package/dist/omadaClient/diagnose.js.map +1 -0
- package/dist/omadaClient/index.d.ts +6 -0
- package/dist/omadaClient/index.js +15 -0
- package/dist/omadaClient/index.js.map +1 -1
- package/dist/omadaClient/macGroups.d.ts +58 -0
- package/dist/omadaClient/macGroups.js +124 -0
- package/dist/omadaClient/macGroups.js.map +1 -0
- package/dist/tools/infra/actions.d.ts +1 -1
- package/dist/tools/infra/actions.js +1 -1
- package/dist/tools/omada/index.js +6 -0
- package/dist/tools/omada/index.js.map +1 -1
- package/dist/tools/omada/macGroups.d.ts +19 -0
- package/dist/tools/omada/macGroups.js +77 -0
- package/dist/tools/omada/macGroups.js.map +1 -0
- package/dist/tools/omada/namespace.js +8 -0
- package/dist/tools/omada/namespace.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
- package/.codex/review-rules.md +0 -16
- package/.dockerignore +0 -8
- package/.gitattributes +0 -30
- package/.github/workflows/ci.yml +0 -193
- package/AGENTS.md +0 -389
- package/Dockerfile +0 -50
- package/docker-compose.yml +0 -23
- package/docs/CHANGELOG.md +0 -341
- package/docs/COVERAGE.md +0 -219
- package/docs/QUICK_START.md +0 -240
- package/eslint.config.js +0 -33
- package/n8n/ai-agent-safety-monitor.json +0 -355
- package/openapi.json +0 -1259
- package/scripts/check-version-sync.mjs +0 -69
- package/scripts/generate-jwt.ts +0 -121
- package/src/config.ts +0 -440
- package/src/haClient/automations.ts +0 -261
- package/src/haClient/calendars.ts +0 -94
- package/src/haClient/config.ts +0 -52
- package/src/haClient/devices.ts +0 -653
- package/src/haClient/entities.ts +0 -128
- package/src/haClient/events.ts +0 -689
- package/src/haClient/history.ts +0 -73
- package/src/haClient/index.ts +0 -336
- package/src/haClient/request.ts +0 -142
- package/src/haClient/services.ts +0 -45
- package/src/haClient/states.ts +0 -60
- package/src/haClient/updates.ts +0 -58
- package/src/haClient/wsCommand.ts +0 -44
- package/src/index.ts +0 -164
- package/src/localAI/index.ts +0 -88
- package/src/localAI/prompts.ts +0 -50
- package/src/localAI/providers/base.ts +0 -120
- package/src/localAI/providers/ollama.ts +0 -78
- package/src/localAI/providers/openai.ts +0 -86
- package/src/localAI/types.ts +0 -67
- package/src/omadaClient/auth.ts +0 -178
- package/src/omadaClient/client.ts +0 -337
- package/src/omadaClient/device.ts +0 -118
- package/src/omadaClient/index.ts +0 -310
- package/src/omadaClient/network.ts +0 -284
- package/src/omadaClient/request.ts +0 -365
- package/src/omadaClient/security.ts +0 -51
- package/src/omadaClient/site.ts +0 -344
- package/src/ownerQuestions/service.ts +0 -536
- package/src/permissions/index.ts +0 -143
- package/src/resources/index.ts +0 -213
- package/src/server/auth.ts +0 -175
- package/src/server/chatFace.ts +0 -789
- package/src/server/chatSlice.ts +0 -57
- package/src/server/common.ts +0 -170
- package/src/server/eventSubscription.ts +0 -343
- package/src/server/http.ts +0 -626
- package/src/server/instructions.ts +0 -97
- package/src/server/rateLimiter.ts +0 -227
- package/src/server/stdio.ts +0 -41
- package/src/server/stream.ts +0 -205
- package/src/tools/ai/analyzeSensors.ts +0 -33
- package/src/tools/ai/index.ts +0 -20
- package/src/tools/common.ts +0 -442
- package/src/tools/homeassistant/askOwner.ts +0 -133
- package/src/tools/homeassistant/automationControls.ts +0 -66
- package/src/tools/homeassistant/calendar.ts +0 -97
- package/src/tools/homeassistant/callService.ts +0 -25
- package/src/tools/homeassistant/controlClimate.ts +0 -68
- package/src/tools/homeassistant/controlCover.ts +0 -48
- package/src/tools/homeassistant/controlFan.ts +0 -44
- package/src/tools/homeassistant/controlLight.ts +0 -38
- package/src/tools/homeassistant/controlMediaPlayer.ts +0 -50
- package/src/tools/homeassistant/createAutomation.ts +0 -35
- package/src/tools/homeassistant/deleteAutomation.ts +0 -24
- package/src/tools/homeassistant/entityAction.ts +0 -35
- package/src/tools/homeassistant/entityGuard.ts +0 -28
- package/src/tools/homeassistant/getAllSensors.ts +0 -46
- package/src/tools/homeassistant/getAutomationTrace.ts +0 -30
- package/src/tools/homeassistant/getDomainSummary.ts +0 -29
- package/src/tools/homeassistant/getEntitiesByDomain.ts +0 -56
- package/src/tools/homeassistant/getHistory.ts +0 -24
- package/src/tools/homeassistant/getState.ts +0 -24
- package/src/tools/homeassistant/getStates.ts +0 -46
- package/src/tools/homeassistant/getVersion.ts +0 -21
- package/src/tools/homeassistant/index.ts +0 -121
- package/src/tools/homeassistant/listAutomations.ts +0 -35
- package/src/tools/homeassistant/listEntities.ts +0 -44
- package/src/tools/homeassistant/listPersons.ts +0 -46
- package/src/tools/homeassistant/sceneAndScript.ts +0 -53
- package/src/tools/homeassistant/searchEntities.ts +0 -58
- package/src/tools/homeassistant/sendNotification.ts +0 -179
- package/src/tools/homeassistant/systemTools.ts +0 -52
- package/src/tools/homeassistant/triggerAutomation.ts +0 -24
- package/src/tools/index.ts +0 -78
- package/src/tools/infra/actions.ts +0 -95
- package/src/tools/infra/index.ts +0 -138
- package/src/tools/omada/blockClient.ts +0 -28
- package/src/tools/omada/cyclePoePort.ts +0 -32
- package/src/tools/omada/deleteClient.ts +0 -27
- package/src/tools/omada/disableClientRateLimit.ts +0 -23
- package/src/tools/omada/getClient.ts +0 -14
- package/src/tools/omada/getDevice.ts +0 -14
- package/src/tools/omada/getFirewallSetting.ts +0 -14
- package/src/tools/omada/getInternetInfo.ts +0 -14
- package/src/tools/omada/getLanNetworkList.ts +0 -14
- package/src/tools/omada/getLanProfileList.ts +0 -14
- package/src/tools/omada/getPortForwardingStatus.ts +0 -26
- package/src/tools/omada/getRateLimitProfiles.ts +0 -14
- package/src/tools/omada/getSiteNtpStatus.ts +0 -14
- package/src/tools/omada/getSsidDetail.ts +0 -22
- package/src/tools/omada/getSsidList.ts +0 -21
- package/src/tools/omada/getSwitchStackDetail.ts +0 -14
- package/src/tools/omada/getThreatList.ts +0 -42
- package/src/tools/omada/getWlanGroupList.ts +0 -14
- package/src/tools/omada/graph.ts +0 -187
- package/src/tools/omada/index.ts +0 -153
- package/src/tools/omada/listBlockedClients.ts +0 -17
- package/src/tools/omada/listClients.ts +0 -14
- package/src/tools/omada/listClientsActivity.ts +0 -25
- package/src/tools/omada/listClientsPastConnections.ts +0 -44
- package/src/tools/omada/listDevices.ts +0 -14
- package/src/tools/omada/listDevicesStats.ts +0 -41
- package/src/tools/omada/listMostActiveClients.ts +0 -14
- package/src/tools/omada/listSites.ts +0 -18
- package/src/tools/omada/namespace.ts +0 -1164
- package/src/tools/omada/searchDevices.ts +0 -20
- package/src/tools/omada/setClientRateLimit.ts +0 -26
- package/src/tools/omada/setClientRateLimitProfile.ts +0 -25
- package/src/tools/omada/setSiteNtpServers.ts +0 -36
- package/src/tools/omada/setSsidEnabled.ts +0 -38
- package/src/tools/omada/unblockClient.ts +0 -26
- package/src/tools/types.ts +0 -11
- package/src/tools/utils/pagination-schema.ts +0 -27
- package/src/types/ai/index.ts +0 -11
- package/src/types/ai/types.ts +0 -67
- package/src/types/homeassistant/automations.ts +0 -43
- package/src/types/homeassistant/calendars.ts +0 -26
- package/src/types/homeassistant/config.ts +0 -14
- package/src/types/homeassistant/entities.ts +0 -14
- package/src/types/homeassistant/errors.ts +0 -33
- package/src/types/homeassistant/haConfig.ts +0 -7
- package/src/types/homeassistant/history.ts +0 -13
- package/src/types/homeassistant/index.ts +0 -46
- package/src/types/homeassistant/request.ts +0 -6
- package/src/types/homeassistant/serviceCall.ts +0 -18
- package/src/types/homeassistant/states.ts +0 -58
- package/src/types/homeassistant/updates.ts +0 -28
- package/src/types/index.ts +0 -12
- package/src/types/omada/activeClientInfo.ts +0 -17
- package/src/types/omada/clientActivity.ts +0 -32
- package/src/types/omada/clientBlockStatus.ts +0 -11
- package/src/types/omada/clientPastConnection.ts +0 -82
- package/src/types/omada/index.ts +0 -14
- package/src/types/omada/omadaApiResponse.ts +0 -5
- package/src/types/omada/omadaClientInfo.ts +0 -11
- package/src/types/omada/omadaDeviceInfo.ts +0 -11
- package/src/types/omada/omadaDeviceStats.ts +0 -31
- package/src/types/omada/omadaSiteSummary.ts +0 -5
- package/src/types/omada/oswStackDetail.ts +0 -11
- package/src/types/omada/paginatedResult.ts +0 -6
- package/src/types/omada/rateLimitProfile.ts +0 -58
- package/src/types/omada/threatInfo.ts +0 -38
- package/src/types/omada/tokenResult.ts +0 -6
- package/src/types.ts +0 -2
- package/src/utils/config-validations.ts +0 -68
- package/src/utils/jwt.ts +0 -112
- package/src/utils/logger.ts +0 -121
- package/src/utils/plainText.ts +0 -48
- package/src/utils/redact.ts +0 -59
- package/src/utils/sanitizeError.ts +0 -18
- package/src/utils/tlsDispatcher.ts +0 -69
- package/src/version.ts +0 -5
- package/tests/bdd/automation-creation.spec.ts +0 -214
- package/tests/bdd/automation-management.spec.ts +0 -267
- package/tests/bdd/calendar.spec.ts +0 -190
- package/tests/bdd/configuration.spec.ts +0 -283
- package/tests/bdd/device-control.spec.ts +0 -344
- package/tests/bdd/entity-listing.spec.ts +0 -208
- package/tests/bdd/entity-search.spec.ts +0 -183
- package/tests/bdd/history-retrieval.spec.ts +0 -195
- package/tests/bdd/notifications.spec.ts +0 -238
- package/tests/bdd/service-calls.spec.ts +0 -144
- package/tests/bdd/state-retrieval.spec.ts +0 -204
- package/tests/bench/hotpaths.bench.ts +0 -68
- package/tests/config.test.ts +0 -355
- package/tests/features/automation-creation.feature +0 -36
- package/tests/features/automation-management.feature +0 -54
- package/tests/features/calendar.feature +0 -37
- package/tests/features/configuration.feature +0 -70
- package/tests/features/device-control.feature +0 -100
- package/tests/features/entity-listing.feature +0 -51
- package/tests/features/entity-search.feature +0 -44
- package/tests/features/history-retrieval.feature +0 -38
- package/tests/features/notifications.feature +0 -37
- package/tests/features/service-calls.feature +0 -35
- package/tests/features/state-retrieval.feature +0 -37
- package/tests/fixtures/openapi-default-slice.json +0 -290
- package/tests/haClient/automationTrace.test.ts +0 -59
- package/tests/haClient/automations.test.ts +0 -149
- package/tests/haClient/config.test.ts +0 -117
- package/tests/haClient/entities.test.ts +0 -188
- package/tests/haClient/events.test.ts +0 -455
- package/tests/haClient/eventsTls.test.ts +0 -52
- package/tests/haClient/history.test.ts +0 -228
- package/tests/haClient/index.test.ts +0 -243
- package/tests/haClient/request.test.ts +0 -217
- package/tests/haClient/services.test.ts +0 -120
- package/tests/haClient/states.test.ts +0 -119
- package/tests/haClient/updates.test.ts +0 -193
- package/tests/index.test.ts +0 -160
- package/tests/integration/homeassistant.test.ts +0 -144
- package/tests/integration/omada.test.ts +0 -167
- package/tests/integration/server.test.ts +0 -151
- package/tests/localAI/index.test.ts +0 -177
- package/tests/localAI/ollama.test.ts +0 -187
- package/tests/localAI/openai.test.ts +0 -257
- package/tests/omadaClient/actions.test.ts +0 -161
- package/tests/omadaClient/clientBlocks.test.ts +0 -170
- package/tests/omadaClient/ntp.test.ts +0 -381
- package/tests/omadaClient/site.test.ts +0 -37
- package/tests/ownerQuestions/service.test.ts +0 -499
- package/tests/ownerQuestions/tools.test.ts +0 -186
- package/tests/permissions/index.test.ts +0 -217
- package/tests/resources/index.test.ts +0 -288
- package/tests/scripts/generateJwt.test.ts +0 -44
- package/tests/security/accessControl.test.ts +0 -223
- package/tests/security/authentication.test.ts +0 -117
- package/tests/security/configuration.test.ts +0 -170
- package/tests/security/cryptoTransport.test.ts +0 -172
- package/tests/security/dependencies.test.ts +0 -152
- package/tests/security/injection.test.ts +0 -117
- package/tests/security/insecureDesign.test.ts +0 -121
- package/tests/security/logging.test.ts +0 -131
- package/tests/security/resourceConsumption.test.ts +0 -142
- package/tests/server/auth.test.ts +0 -249
- package/tests/server/chatFace.test.ts +0 -320
- package/tests/server/common.test.ts +0 -84
- package/tests/server/http.test.ts +0 -561
- package/tests/server/instructions.test.ts +0 -152
- package/tests/server/memoizeJsonSchema.test.ts +0 -71
- package/tests/server/stdio.test.ts +0 -99
- package/tests/server/stream.test.ts +0 -285
- package/tests/server/toolVisibility.http.test.ts +0 -111
- package/tests/server/toolVisibility.test.ts +0 -129
- package/tests/tools/ai/analyzeSensors.test.ts +0 -227
- package/tests/tools/common.test.ts +0 -123
- package/tests/tools/homeassistant/handlers.test.ts +0 -872
- package/tests/tools/infra/invokeAction.test.ts +0 -280
- package/tests/tools/omada/graph.test.ts +0 -385
- package/tests/tools/omada/handlers.test.ts +0 -897
- package/tests/tools/omada/namespace.test.ts +0 -483
- package/tests/tools/registry.test.ts +0 -168
- package/tests/utils/config-validations.test.ts +0 -352
- package/tests/utils/jwt.test.ts +0 -115
- package/tests/utils/logger.test.ts +0 -327
- package/tests/utils/redact.test.ts +0 -105
- package/tsconfig.json +0 -24
- package/vitest.config.ts +0 -38
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
-
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
-
|
|
7
|
-
const searchDevicesSchema = z.object({
|
|
8
|
-
searchKey: z.string().min(1, 'searchKey is required'),
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
export function registerSearchDevicesTool(server: McpServer, client: OmadaClient): void {
|
|
12
|
-
server.registerTool(
|
|
13
|
-
'omada_searchDevices',
|
|
14
|
-
{
|
|
15
|
-
description: 'Search for devices globally across all sites',
|
|
16
|
-
inputSchema: searchDevicesSchema,
|
|
17
|
-
},
|
|
18
|
-
wrapToolHandler('omada_searchDevices', async ({ searchKey }) => toToolResult(await client.searchDevices(searchKey)), Permission.QUERY)
|
|
19
|
-
);
|
|
20
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
-
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
-
|
|
7
|
-
export function registerSetClientRateLimitTool(server: McpServer, client: OmadaClient): void {
|
|
8
|
-
const inputSchema = z.object({
|
|
9
|
-
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
10
|
-
downLimit: z.number().positive('downLimit must be a positive number (in Kbps)'),
|
|
11
|
-
upLimit: z.number().positive('upLimit must be a positive number (in Kbps)'),
|
|
12
|
-
siteId: z.string().min(1).optional(),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
server.registerTool(
|
|
16
|
-
'omada_setClientRateLimit',
|
|
17
|
-
{
|
|
18
|
-
description: 'Set custom bandwidth limits for a client (download/upload in Kbps)',
|
|
19
|
-
inputSchema: inputSchema,
|
|
20
|
-
},
|
|
21
|
-
wrapToolHandler('omada_setClientRateLimit', async ({ clientMac, downLimit, upLimit, siteId }) =>
|
|
22
|
-
toToolResult(await client.setClientRateLimit(clientMac, downLimit, upLimit, siteId)),
|
|
23
|
-
Permission.CONTROL
|
|
24
|
-
)
|
|
25
|
-
);
|
|
26
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
-
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
-
|
|
7
|
-
export function registerSetClientRateLimitProfileTool(server: McpServer, client: OmadaClient): void {
|
|
8
|
-
const inputSchema = z.object({
|
|
9
|
-
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
10
|
-
profileId: z.string().min(1, 'profileId (rate limit profile ID) is required'),
|
|
11
|
-
siteId: z.string().min(1).optional(),
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
server.registerTool(
|
|
15
|
-
'omada_setClientRateLimitProfile',
|
|
16
|
-
{
|
|
17
|
-
description: 'Apply a rate limit profile to a client',
|
|
18
|
-
inputSchema: inputSchema,
|
|
19
|
-
},
|
|
20
|
-
wrapToolHandler('omada_setClientRateLimitProfile', async ({ clientMac, profileId, siteId }) =>
|
|
21
|
-
toToolResult(await client.setClientRateLimitProfile(clientMac, profileId, siteId)),
|
|
22
|
-
Permission.CONTROL
|
|
23
|
-
)
|
|
24
|
-
);
|
|
25
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
-
import { MAX_NTP_SERVERS } from '../../omadaClient/site.js';
|
|
6
|
-
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
7
|
-
|
|
8
|
-
export const setSiteNtpServersSchema = z.object({
|
|
9
|
-
servers: z
|
|
10
|
-
.array(z.string().min(1))
|
|
11
|
-
.max(MAX_NTP_SERVERS)
|
|
12
|
-
.describe(`NTP server addresses (hostname or IPv4), in priority order; at most ${MAX_NTP_SERVERS}. Replaces the current list.`),
|
|
13
|
-
enabled: z.boolean().optional().describe('Turn the site NTP setting on (default) or off'),
|
|
14
|
-
siteId: z.string().min(1).optional(),
|
|
15
|
-
dryRun: z.boolean().optional().describe('If true, return the exact change without writing it'),
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
export function registerSetSiteNtpServersTool(server: McpServer, client: OmadaClient): void {
|
|
19
|
-
server.registerTool(
|
|
20
|
-
'omada_setSiteNtpServers',
|
|
21
|
-
{
|
|
22
|
-
description:
|
|
23
|
-
"Set a site's NTP (network time) servers, replacing the current list. " +
|
|
24
|
-
'Omada stores NTP in the site settings, so this re-writes the site settings with only the NTP fields changed; ' +
|
|
25
|
-
'the result shows the list before and after. Use dryRun first to preview. ' +
|
|
26
|
-
'Wrong time breaks certificates, logs and schedules on every network device - confirm with the user before applying.',
|
|
27
|
-
inputSchema: setSiteNtpServersSchema,
|
|
28
|
-
},
|
|
29
|
-
wrapToolHandler(
|
|
30
|
-
'omada_setSiteNtpServers',
|
|
31
|
-
async ({ servers, enabled, siteId, dryRun }: z.infer<typeof setSiteNtpServersSchema>) =>
|
|
32
|
-
toToolResult(await client.setSiteNtpServers(servers, { enabled, siteId, dryRun })),
|
|
33
|
-
Permission.CONFIGURE
|
|
34
|
-
)
|
|
35
|
-
);
|
|
36
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
-
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
-
|
|
7
|
-
export const setSsidEnabledSchema = z.object({
|
|
8
|
-
ssid: z.string().min(1, 'ssid (SSID name or ssidId) is required'),
|
|
9
|
-
enabled: z.boolean(),
|
|
10
|
-
siteId: z.string().min(1).optional(),
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Shared handler — used by the MCP registration below AND the chat face
|
|
15
|
-
* (`POST /api/tools/omada_setSsidEnabled`), so both doors run identical
|
|
16
|
-
* validation + RBAC (v1.7 single-source-of-truth rule).
|
|
17
|
-
*/
|
|
18
|
-
export function createSetSsidEnabledHandler(client: OmadaClient) {
|
|
19
|
-
return wrapToolHandler('omada_setSsidEnabled', async ({ ssid, enabled, siteId }: z.infer<typeof setSsidEnabledSchema>) =>
|
|
20
|
-
toToolResult(await client.setSsidEnabled(ssid, enabled, siteId)),
|
|
21
|
-
Permission.CONTROL
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function registerSetSsidEnabledTool(server: McpServer, client: OmadaClient): void {
|
|
26
|
-
server.registerTool(
|
|
27
|
-
'omada_setSsidEnabled',
|
|
28
|
-
{
|
|
29
|
-
description:
|
|
30
|
-
'Turn an SSID (WiFi network, e.g. the guest network) on or off by name or ssidId. ' +
|
|
31
|
-
'Omada has no direct SSID switch, so disabling applies a 24/7 "radio off" WLAN schedule ' +
|
|
32
|
-
'(the SSID stops broadcasting entirely) and enabling removes it — fully reversible. ' +
|
|
33
|
-
'All clients on that SSID lose connectivity when disabled - confirm with the user before applying.',
|
|
34
|
-
inputSchema: setSsidEnabledSchema,
|
|
35
|
-
},
|
|
36
|
-
createSetSsidEnabledHandler(client)
|
|
37
|
-
);
|
|
38
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
-
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
-
|
|
7
|
-
export function registerUnblockClientTool(server: McpServer, client: OmadaClient): void {
|
|
8
|
-
const inputSchema = z.object({
|
|
9
|
-
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
10
|
-
siteId: z.string().min(1).optional(),
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
server.registerTool(
|
|
14
|
-
'omada_unblockClient',
|
|
15
|
-
{
|
|
16
|
-
description:
|
|
17
|
-
'Unblock a previously blocked client by MAC address, restoring its network access. ' +
|
|
18
|
-
'Use omada_listClients first to find the exact MAC.',
|
|
19
|
-
inputSchema: inputSchema,
|
|
20
|
-
},
|
|
21
|
-
wrapToolHandler('omada_unblockClient', async ({ clientMac, siteId }) =>
|
|
22
|
-
toToolResult(await client.unblockClient(clientMac, siteId)),
|
|
23
|
-
Permission.CONTROL
|
|
24
|
-
)
|
|
25
|
-
);
|
|
26
|
-
}
|
package/src/tools/types.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool type definitions
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
6
|
-
import type { HaClient } from '../haClient/index.js';
|
|
7
|
-
import type { LocalAIClient } from '../localAI/index.js';
|
|
8
|
-
|
|
9
|
-
export interface ToolRegistration {
|
|
10
|
-
register(server: McpServer, client: HaClient, aiClient?: LocalAIClient): void;
|
|
11
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Standard Omada API pagination parameters.
|
|
5
|
-
* All paginated Omada API endpoints require both page and pageSize parameters.
|
|
6
|
-
*
|
|
7
|
-
* According to the API specification:
|
|
8
|
-
* - page: Start page number. Start from 1. (required)
|
|
9
|
-
* - pageSize: Number of entries per page. Range: 1-1000. (required)
|
|
10
|
-
*
|
|
11
|
-
* @param defaultPageSize - Default page size to use (default: 10)
|
|
12
|
-
* @returns Zod object shape with page and pageSize fields
|
|
13
|
-
*/
|
|
14
|
-
export function createPaginationSchema(defaultPageSize = 10) {
|
|
15
|
-
return {
|
|
16
|
-
page: z.number().int().min(1).default(1).describe('Start page number. Start from 1.'),
|
|
17
|
-
pageSize: z.number().int().min(1).max(1000).default(defaultPageSize).describe('Number of entries per page. Range: 1-1000.'),
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Type representing the pagination parameters shape.
|
|
23
|
-
*/
|
|
24
|
-
export interface PaginationParams {
|
|
25
|
-
page: number;
|
|
26
|
-
pageSize: number;
|
|
27
|
-
}
|
package/src/types/ai/index.ts
DELETED
package/src/types/ai/types.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local AI Client Types
|
|
3
|
-
* Shared interfaces for AI provider implementations
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Supported AI provider types
|
|
8
|
-
* Use 'none' to explicitly disable AI features
|
|
9
|
-
*/
|
|
10
|
-
export type AIProviderType = 'ollama' | 'openai' | 'none';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Sensor data input for analysis
|
|
14
|
-
*/
|
|
15
|
-
export interface SensorData {
|
|
16
|
-
[entity_id: string]: {
|
|
17
|
-
state: string;
|
|
18
|
-
unit?: string;
|
|
19
|
-
attributes?: Record<string, unknown>;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* AI analysis result
|
|
25
|
-
*/
|
|
26
|
-
export interface AnalysisResult {
|
|
27
|
-
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
28
|
-
issue: string;
|
|
29
|
-
reasoning: string;
|
|
30
|
-
recommended_actions: string[];
|
|
31
|
-
ssh_diagnostics: string[];
|
|
32
|
-
confidence: number;
|
|
33
|
-
model: string;
|
|
34
|
-
provider: string;
|
|
35
|
-
response_time: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* AI provider configuration
|
|
40
|
-
*/
|
|
41
|
-
export interface AIProviderConfig {
|
|
42
|
-
provider: AIProviderType;
|
|
43
|
-
baseUrl: string;
|
|
44
|
-
model: string;
|
|
45
|
-
timeout: number;
|
|
46
|
-
apiKey?: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* AI provider interface - all providers must implement this
|
|
51
|
-
*/
|
|
52
|
-
export interface AIProviderInterface {
|
|
53
|
-
/**
|
|
54
|
-
* Analyze sensor data using AI
|
|
55
|
-
*/
|
|
56
|
-
analyzeSensors(sensors: SensorData): Promise<AnalysisResult>;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Check if the AI provider is available
|
|
60
|
-
*/
|
|
61
|
-
checkHealth(): Promise<boolean>;
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Get the provider name
|
|
65
|
-
*/
|
|
66
|
-
getProviderName(): string;
|
|
67
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Automation-related types for Home Assistant
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface Automation {
|
|
6
|
-
id: string;
|
|
7
|
-
alias: string;
|
|
8
|
-
state: 'on' | 'off';
|
|
9
|
-
last_triggered: string | null;
|
|
10
|
-
description?: string;
|
|
11
|
-
mode?: 'single' | 'restart' | 'queued' | 'parallel';
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface AutomationTrigger {
|
|
15
|
-
platform: string;
|
|
16
|
-
[key: string]: unknown;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface AutomationCondition {
|
|
20
|
-
condition: string;
|
|
21
|
-
[key: string]: unknown;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface AutomationAction {
|
|
25
|
-
service?: string;
|
|
26
|
-
target?: {
|
|
27
|
-
entity_id?: string | string[];
|
|
28
|
-
device_id?: string | string[];
|
|
29
|
-
area_id?: string | string[];
|
|
30
|
-
};
|
|
31
|
-
data?: Record<string, unknown>;
|
|
32
|
-
[key: string]: unknown;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface AutomationConfig {
|
|
36
|
-
id?: string;
|
|
37
|
-
alias: string;
|
|
38
|
-
description?: string;
|
|
39
|
-
mode?: 'single' | 'restart' | 'queued' | 'parallel';
|
|
40
|
-
trigger: AutomationTrigger | AutomationTrigger[];
|
|
41
|
-
condition?: AutomationCondition | AutomationCondition[];
|
|
42
|
-
action: AutomationAction | AutomationAction[];
|
|
43
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Calendar types for Home Assistant
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface CalendarEvent {
|
|
6
|
-
summary: string;
|
|
7
|
-
start: {
|
|
8
|
-
dateTime?: string;
|
|
9
|
-
date?: string;
|
|
10
|
-
};
|
|
11
|
-
end: {
|
|
12
|
-
dateTime?: string;
|
|
13
|
-
date?: string;
|
|
14
|
-
};
|
|
15
|
-
description?: string;
|
|
16
|
-
location?: string;
|
|
17
|
-
uid?: string;
|
|
18
|
-
recurrence_id?: string;
|
|
19
|
-
rrule?: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface Calendar {
|
|
23
|
-
entity_id: string;
|
|
24
|
-
name: string;
|
|
25
|
-
state: string;
|
|
26
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Home Assistant configuration and version types
|
|
3
|
-
* Note: Only safe, public information - sensitive fields are filtered out
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface HaVersion {
|
|
7
|
-
version: string;
|
|
8
|
-
location_name?: string;
|
|
9
|
-
time_zone?: string;
|
|
10
|
-
unit_system?: Record<string, string>;
|
|
11
|
-
// Excluded for privacy/security: config_dir, components, allowlist_external_dirs,
|
|
12
|
-
// allowlist_external_urls, state, external_url, internal_url, latitude, longitude,
|
|
13
|
-
// elevation, currency, country, language
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entity summary types for Home Assistant
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface DomainSummary {
|
|
6
|
-
domain: string;
|
|
7
|
-
count: number;
|
|
8
|
-
states: Record<string, number>;
|
|
9
|
-
entities: Array<{
|
|
10
|
-
entity_id: string;
|
|
11
|
-
state: string;
|
|
12
|
-
friendly_name?: string;
|
|
13
|
-
}>;
|
|
14
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
export class HaError extends Error {
|
|
2
|
-
constructor(
|
|
3
|
-
message: string,
|
|
4
|
-
public code?: string,
|
|
5
|
-
public statusCode?: number,
|
|
6
|
-
public details?: unknown
|
|
7
|
-
) {
|
|
8
|
-
super(message);
|
|
9
|
-
this.name = 'HaError';
|
|
10
|
-
Error.captureStackTrace(this, this.constructor);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export class AuthenticationError extends HaError {
|
|
15
|
-
constructor(message: string, details?: unknown) {
|
|
16
|
-
super(message, 'AUTH_ERROR', 401, details);
|
|
17
|
-
this.name = 'AuthenticationError';
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export class ApiError extends HaError {
|
|
22
|
-
constructor(message: string, statusCode: number, details?: unknown) {
|
|
23
|
-
super(message, 'API_ERROR', statusCode, details);
|
|
24
|
-
this.name = 'ApiError';
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export class ConfigurationError extends HaError {
|
|
29
|
-
constructor(message: string, details?: unknown) {
|
|
30
|
-
super(message, 'CONFIG_ERROR', undefined, details);
|
|
31
|
-
this.name = 'ConfigurationError';
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Home Assistant type exports
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
// Configuration types
|
|
6
|
-
export type { HaConfig } from './haConfig.js';
|
|
7
|
-
export type { HaVersion } from './config.js';
|
|
8
|
-
|
|
9
|
-
// State types
|
|
10
|
-
export type { Entity, EntityListResponse, LightweightEntity, PaginatedEntityResponse } from './states.js';
|
|
11
|
-
export { toLightweight } from './states.js';
|
|
12
|
-
|
|
13
|
-
// Automation types
|
|
14
|
-
export type {
|
|
15
|
-
Automation,
|
|
16
|
-
AutomationConfig,
|
|
17
|
-
AutomationTrigger,
|
|
18
|
-
AutomationCondition,
|
|
19
|
-
AutomationAction,
|
|
20
|
-
} from './automations.js';
|
|
21
|
-
|
|
22
|
-
// Entity summary types
|
|
23
|
-
export type { DomainSummary } from './entities.js';
|
|
24
|
-
|
|
25
|
-
// History types
|
|
26
|
-
export type { LogbookEntry } from './history.js';
|
|
27
|
-
|
|
28
|
-
// Update types
|
|
29
|
-
export type {
|
|
30
|
-
UpdateInfo,
|
|
31
|
-
SupervisorCoreInfo,
|
|
32
|
-
SupervisorInfo,
|
|
33
|
-
SupervisorOsInfo,
|
|
34
|
-
} from './updates.js';
|
|
35
|
-
|
|
36
|
-
// Calendar types
|
|
37
|
-
export type { CalendarEvent, Calendar } from './calendars.js';
|
|
38
|
-
|
|
39
|
-
// Service call types
|
|
40
|
-
export type { ServiceCallData, ServiceCallResponse } from './serviceCall.js';
|
|
41
|
-
|
|
42
|
-
// Request types
|
|
43
|
-
export type { RequestOptions } from './request.js';
|
|
44
|
-
|
|
45
|
-
// Error types
|
|
46
|
-
export { HaError, AuthenticationError, ApiError, ConfigurationError } from './errors.js';
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface ServiceCallData {
|
|
2
|
-
domain: string;
|
|
3
|
-
service: string;
|
|
4
|
-
service_data?: Record<string, unknown>;
|
|
5
|
-
target?: {
|
|
6
|
-
entity_id?: string | string[];
|
|
7
|
-
device_id?: string | string[];
|
|
8
|
-
area_id?: string | string[];
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface ServiceCallResponse {
|
|
13
|
-
context: {
|
|
14
|
-
id: string;
|
|
15
|
-
parent_id: string | null;
|
|
16
|
-
user_id: string | null;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* State-related types for Home Assistant entities
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface Entity {
|
|
6
|
-
entity_id: string;
|
|
7
|
-
state: string;
|
|
8
|
-
attributes: Record<string, unknown>;
|
|
9
|
-
last_changed: string;
|
|
10
|
-
last_updated: string;
|
|
11
|
-
context: {
|
|
12
|
-
id: string;
|
|
13
|
-
parent_id: string | null;
|
|
14
|
-
user_id: string | null;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Lightweight entity representation for reduced payload size.
|
|
20
|
-
* Contains only essential fields needed for browsing/listing entities.
|
|
21
|
-
*/
|
|
22
|
-
export interface LightweightEntity {
|
|
23
|
-
entity_id: string;
|
|
24
|
-
state: string;
|
|
25
|
-
friendly_name?: string;
|
|
26
|
-
unit_of_measurement?: string;
|
|
27
|
-
last_changed: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Convert a full Entity to a LightweightEntity.
|
|
32
|
-
* Reduces payload size by ~90% by excluding full attributes.
|
|
33
|
-
*/
|
|
34
|
-
export function toLightweight(entity: Entity): LightweightEntity {
|
|
35
|
-
return {
|
|
36
|
-
entity_id: entity.entity_id,
|
|
37
|
-
state: entity.state,
|
|
38
|
-
friendly_name: entity.attributes?.friendly_name as string | undefined,
|
|
39
|
-
unit_of_measurement: entity.attributes?.unit_of_measurement as string | undefined,
|
|
40
|
-
last_changed: entity.last_changed,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Paginated response for entity listings.
|
|
46
|
-
*/
|
|
47
|
-
export interface PaginatedEntityResponse<T = LightweightEntity> {
|
|
48
|
-
page: number;
|
|
49
|
-
pageSize: number;
|
|
50
|
-
totalCount: number;
|
|
51
|
-
totalPages: number;
|
|
52
|
-
entities: T[];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface EntityListResponse {
|
|
56
|
-
entities: Entity[];
|
|
57
|
-
total: number;
|
|
58
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Update and supervisor types for Home Assistant
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface UpdateInfo {
|
|
6
|
-
update_type: 'core' | 'supervisor' | 'os' | 'addon';
|
|
7
|
-
name: string;
|
|
8
|
-
version_current: string;
|
|
9
|
-
version_latest: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface SupervisorCoreInfo {
|
|
13
|
-
version: string;
|
|
14
|
-
version_latest?: string;
|
|
15
|
-
update_available?: boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface SupervisorInfo {
|
|
19
|
-
version: string;
|
|
20
|
-
version_latest?: string;
|
|
21
|
-
update_available?: boolean;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface SupervisorOsInfo {
|
|
25
|
-
version: string;
|
|
26
|
-
version_latest?: string;
|
|
27
|
-
update_available?: boolean;
|
|
28
|
-
}
|
package/src/types/index.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Active client information from dashboard.
|
|
3
|
-
*/
|
|
4
|
-
export interface ActiveClientInfo {
|
|
5
|
-
/** Client name */
|
|
6
|
-
name: string;
|
|
7
|
-
/** Whether the client is wireless */
|
|
8
|
-
wireless: boolean;
|
|
9
|
-
/** Client device type */
|
|
10
|
-
type: string;
|
|
11
|
-
/** Client device model */
|
|
12
|
-
model: string;
|
|
13
|
-
/** Client MAC address */
|
|
14
|
-
mac: string;
|
|
15
|
-
/** Total traffic in bytes */
|
|
16
|
-
totalTraffic: number;
|
|
17
|
-
}
|